From 22e82972b29b01a9dc7c4fc47a512fb3522099b7 Mon Sep 17 00:00:00 2001 From: Dan Ichim Date: Mon, 13 Jul 2026 15:11:01 +0300 Subject: [PATCH 01/20] bun builder --- CHANGELOG.md | 7 + commands/bootstrap.js | 31 +- commands/eject.js | 10 +- commands/info.js | 2 +- commands/pack.js | 281 +- commands/serve.js | 333 +- config/bun/build-framework.mjs | 66 + config/bun/build-options.js | 201 + config/bun/build.mjs | 336 + config/bun/dev-proxy.js | 69 + config/bun/dev-serve-utils.js | 111 + config/bun/dev-server.mjs | 200 + config/bun/externals.js | 50 + config/bun/framework.js | 293 + config/bun/generate-html.js | 90 + config/bun/generate-stats.js | 136 + config/bun/ilib-meta.js | 160 + config/bun/plugins/babel-enact.js | 44 + config/bun/plugins/case-sensitive-enact.js | 50 + config/bun/plugins/eslint-enact.js | 65 + config/bun/plugins/externals-enact.js | 155 + config/bun/plugins/index.js | 64 + config/bun/plugins/isomorphic-enact.js | 74 + config/bun/plugins/less-enact.js | 93 + config/bun/plugins/postcss-enact.js | 83 + config/bun/plugins/resolve-enact.js | 57 + config/bun/plugins/snapshot-enact.js | 96 + config/bun/plugins/typescript-enact.js | 77 + config/bun/post-build.js | 41 + config/bun/prerender.js | 36 + config/bun/react-globals-entry.js | 9 + config/bun/resolve-bun.js | 84 + config/bun/resolve-dev-utils.js | 50 + config/bun/snapshot.js | 85 + config/bun/spawn.js | 27 + config/bun/webos-meta.js | 134 + config/createEnvironmentHash.js | 9 - config/webpack.config.js | 685 -- docs/building-apps.md | 11 +- docs/ejecting-apps.md | 12 +- docs/index.md | 4 +- docs/installation.md | 5 +- docs/isomorphic-support.md | 2 +- docs/loading-existing-app.md | 2 +- docs/serving-apps.md | 2 +- docs/starting-a-new-app.md | 10 +- npm-shrinkwrap.json | 7724 ++++++-------------- package.json | 30 +- 48 files changed, 5400 insertions(+), 6796 deletions(-) create mode 100644 config/bun/build-framework.mjs create mode 100644 config/bun/build-options.js create mode 100644 config/bun/build.mjs create mode 100644 config/bun/dev-proxy.js create mode 100644 config/bun/dev-serve-utils.js create mode 100644 config/bun/dev-server.mjs create mode 100644 config/bun/externals.js create mode 100644 config/bun/framework.js create mode 100644 config/bun/generate-html.js create mode 100644 config/bun/generate-stats.js create mode 100644 config/bun/ilib-meta.js create mode 100644 config/bun/plugins/babel-enact.js create mode 100644 config/bun/plugins/case-sensitive-enact.js create mode 100644 config/bun/plugins/eslint-enact.js create mode 100644 config/bun/plugins/externals-enact.js create mode 100644 config/bun/plugins/index.js create mode 100644 config/bun/plugins/isomorphic-enact.js create mode 100644 config/bun/plugins/less-enact.js create mode 100644 config/bun/plugins/postcss-enact.js create mode 100644 config/bun/plugins/resolve-enact.js create mode 100644 config/bun/plugins/snapshot-enact.js create mode 100644 config/bun/plugins/typescript-enact.js create mode 100644 config/bun/post-build.js create mode 100644 config/bun/prerender.js create mode 100644 config/bun/react-globals-entry.js create mode 100644 config/bun/resolve-bun.js create mode 100644 config/bun/resolve-dev-utils.js create mode 100644 config/bun/snapshot.js create mode 100644 config/bun/spawn.js create mode 100644 config/bun/webos-meta.js delete mode 100644 config/createEnvironmentHash.js delete mode 100644 config/webpack.config.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c45d269..078df6e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,13 @@ ### bootstrap * Fixed `--override` to support `package-lock.json` with `lockfileVersion` 2 and 3. +* Detects `bun.lock` / `bun.lockb` and uses `bun install` instead of npm when present. + +### serve, pack + +* Replaced webpack and webpack-dev-server with [Bun](https://bun.com) (`Bun.build()` and `Bun.serve()` with HMR). +* Added `config/bun/` bundler plugins for Babel, LESS, PostCSS, SCSS, and CSS Modules. +* Requires Bun 1.3+ (`engines.bun`). ## 7.3.3 (July 7, 2026) diff --git a/commands/bootstrap.js b/commands/bootstrap.js index ea95acfb..19ad2ccf 100644 --- a/commands/bootstrap.js +++ b/commands/bootstrap.js @@ -17,9 +17,9 @@ function displayHelp () { console.log(` ${e} [options]`); console.log(); console.log(' Options'); - console.log(' -b, --base NPM install root level package'); + console.log(' -b, --base Install root level package dependencies'); console.log(' (enabled by default)'); - console.log(' -s, --sampler NPM install sampler package'); + console.log(' -s, --sampler Install sampler package'); console.log(' (enabled by default)'); console.log(' -a, --allsamples NPM install all sample packages'); console.log(' -l, --link After install, attempt to link any available'); @@ -37,10 +37,17 @@ function displayHelp () { process.exit(0); } -function npmExec (args, cwd = process.cwd(), loglevel) { +function detectPackageManager (cwd) { + if (fs.existsSync(path.join(cwd, 'bun.lock')) || fs.existsSync(path.join(cwd, 'bun.lockb'))) { + return 'bun'; + } + return 'npm'; +} + +function packageExec (command, args, cwd = process.cwd(), loglevel) { return new Promise((resolve, reject) => { - if (loglevel) args.unshift('--loglevel', loglevel); - const child = spawn('npm', args, {stdio: 'inherit', cwd}); + if (command === 'npm' && loglevel) args.unshift('--loglevel', loglevel); + const child = spawn(command, args, {stdio: 'inherit', cwd}); child.on('close', code => { if (code !== 0) { reject(new Error('Failed to ' + args[args.length - 1] + ': ' + path.basename(cwd))); @@ -51,6 +58,20 @@ function npmExec (args, cwd = process.cwd(), loglevel) { }); } +function npmExec (args, cwd = process.cwd(), loglevel) { + const pm = detectPackageManager(cwd); + if (pm === 'bun') { + if (args[0] === 'install') { + return packageExec('bun', ['install'], cwd, loglevel); + } + if (args[0] === 'run') { + return packageExec('bun', ['run', args[1]], cwd, loglevel); + } + } + if (loglevel) args.unshift('--loglevel', loglevel); + return packageExec('npm', args, cwd, loglevel); +} + function newline () { console.log(); } diff --git a/commands/eject.js b/commands/eject.js index 10734c20..7b3c7329 100755 --- a/commands/eject.js +++ b/commands/eject.js @@ -40,10 +40,10 @@ const enhanced = ['chalk', 'cross-spawn', 'filesize', 'fs-extra', 'minimist', 's const content = ['@babel/runtime', 'core-js', 'react', 'react-dom']; const bareDeps = {'cpy-cli': '^3.1.1', rimraf: '^3.0.2'}; const bareTasks = { - serve: 'webpack-dev-server --hot --inline --env development --config config/webpack.config.js', - pack: 'webpack --env development --config config/webpack.config.js && cpy public dist', - 'pack-p': 'webpack --env production --config config/webpack.config.js && cpy public dist', - watch: 'cpy public dist && webpack --env development --config config/webpack.config.js --watch', + serve: 'bun config/bun/dev-server.mjs', + pack: 'bun config/bun/build.mjs && cpy public dist', + 'pack-p': 'bun config/bun/build.mjs --production && cpy public dist', + watch: 'cpy public dist && bun config/bun/build.mjs --watch', clean: 'rimraf build dist', lint: 'eslint --no-config-lookup --config enact --ignore-pattern config/* .', license: 'license-checker ', @@ -61,7 +61,7 @@ function displayHelp () { console.log(' Options'); console.log(' -b, --bare Abandon Enact CLI command enhancements'); console.log(' and eject into a a barebones setup (using'); - console.log(' webpack, eslint, karma, etc. directly)'); + console.log(' Bun, eslint, karma, etc. directly)'); console.log(' -v, --version Display version information'); console.log(' -h, --help Display help information'); console.log(); diff --git a/commands/info.js b/commands/info.js index e670a9f3..b826dc39 100644 --- a/commands/info.js +++ b/commands/info.js @@ -119,7 +119,7 @@ function api ({cliInfo = false, dev = false} = {}) { 'eslint', 'jest', 'less', - 'webpack' + 'bun' ].forEach(dep => logVersion(dep)); } else { const app = require('@enact/dev-utils').optionParser; diff --git a/commands/pack.js b/commands/pack.js index cb937de1..cbde3f89 100755 --- a/commands/pack.js +++ b/commands/pack.js @@ -1,25 +1,11 @@ /* eslint no-console: off, no-undef: off */ /* eslint-env node, es6 */ -// @remove-on-eject-begin -/** - * Portions of this source code file are from create-react-app, used under the - * following MIT license: - * - * Copyright (c) 2013-present, Facebook, Inc. - * https://github.com/facebook/create-react-app - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ -// @remove-on-eject-end const path = require('path'); const {filesize} = require('filesize'); const fs = require('fs-extra'); const minimist = require('minimist'); -const formatWebpackMessages = require('react-dev-utils/formatWebpackMessages'); -const printBuildError = require('react-dev-utils/printBuildError'); -const webpack = require('webpack'); -const {optionParser: app, mixins, configHelper: helper} = require('@enact/dev-utils'); +const {optionParser: app} = require('@enact/dev-utils'); +const {spawnBunScript} = require('../config/bun/spawn'); let chalk; let stripAnsi; @@ -57,110 +43,19 @@ function displayHelp () { console.log(' -v, --version Display version information'); console.log(' -h, --help Display help information'); console.log(); - /* - Private Options: - --entry Specify an override entrypoint - --no-minify Will skip minification during production build - --no-split-css Will not split CSS into separate files - --framework Builds the @enact/*, react, and react-dom into an external framework - --externals Specify a local directory path to the standalone external framework - --externals-public Remote public path to the external framework for use injecting into HTML - --externals-polyfill Flag whether to use external polyfill (or include in framework build) - --ilib-additional-path Specify iLib additional resources path - */ process.exit(0); } -function details (err, stats, output) { - let messages; - if (err) { - if (!err.message) return err; - let msg = err.message; - - // Add additional information for postcss errors - if (Object.prototype.hasOwnProperty.call(err, 'postcssNode')) { - msg += '\nCompileError: Begins at CSS selector ' + err['postcssNode'].selector; - } - - // Generate pretty/formatted warnins/errors - messages = formatWebpackMessages({ - errors: [msg], - warnings: [] - }); - } else { - // Remove any ESLint fixable notices since we're not running via eslint command - // and don't support a `--fix` optiob ourselves; don't want to confuse devs - stats.compilation.warnings.forEach(w => { - const eslintFix = /\n.* potentially fixable with the `--fix` option./gm; - w.message = w.message.replace(eslintFix, ''); - }); - - // Generate pretty/formatted warnins/errors - const statsJSON = stats.toJson({all: false, warnings: true, errors: true}); - messages = formatWebpackMessages(statsJSON); - } - - if (messages.errors.length) { - return new Error(messages.errors.join('\n\n')); - } else if ( - typeof process.env.CI === 'string' && - process.env.CI.toLowerCase() !== 'false' && - messages.warnings.length - ) { - // Ignore sourcemap warnings in CI builds. See #8227 for more info. - const filteredWarnings = messages.warnings.filter(w => !/Failed to parse source map/.test(w)); - if (filteredWarnings.length) { - console.log( - chalk.yellow( - '\nTreating warnings as errors because process.env.CI = true. \n' + - 'Most CI servers set it automatically.\n' - ) - ); - return new Error(filteredWarnings.join('\n\n')); - } - } else { - copyPublicFolder(output); - if (messages.warnings.length) { - console.log(chalk.yellow('Compiled with warnings:\n')); - console.log(messages.warnings.join('\n\n') + '\n'); - } else { - console.log(chalk.green('Compiled successfully.')); - } - if (process.env.NODE_ENV === 'development') { - console.log( - chalk.yellow( - 'NOTICE: This build contains debugging functionality and may run' + - ' slower than in production mode.' - ) - ); - } - console.log(); - - printFileSizes(stats, output); - console.log(); - } -} - -function copyPublicFolder (output) { - const staticAssets = './public'; - if (fs.existsSync(staticAssets)) { - fs.copySync(staticAssets, output, { - dereference: true - }); - } -} - -// Print a detailed summary of build files. -function printFileSizes (stats, output) { - const assets = stats - .toJson({all: false, assets: true, cachedAssets: true}) - .assets.filter(asset => /\.(js|css|bin)$/.test(asset.name)) - .map(asset => { - const size = fs.statSync(path.join(output, asset.name)).size; +function printFileSizes (output) { + const assets = fs + .readdirSync(output) + .filter(name => /\.(js|css|bin)$/.test(name)) + .map(name => { + const size = fs.statSync(path.join(output, name)).size; return { - folder: path.relative(app.context, path.join(output, path.dirname(asset.name))), - name: path.basename(asset.name), - size: size, + folder: path.relative(app.context, output), + name, + size, sizeLabel: filesize(size) }; }); @@ -173,8 +68,7 @@ function printFileSizes (stats, output) { let sizeLabel = asset.sizeLabel; const sizeLength = stripAnsi(sizeLabel).length; if (sizeLength < longestSizeLabelLength) { - const rightPadding = ' '.repeat(longestSizeLabelLength - sizeLength); - sizeLabel += rightPadding; + sizeLabel += ' '.repeat(longestSizeLabelLength - sizeLength); } console.log(' ' + sizeLabel + ' ' + chalk.dim(asset.folder + path.sep) + chalk.cyan(asset.name)); }); @@ -182,59 +76,33 @@ function printFileSizes (stats, output) { function printErrorDetails (err, handler) { console.log(); - if (process.env.TSC_COMPILE_ON_ERROR === 'true') { - console.log( - chalk.yellow( - 'Compiled with the following type errors (you may want to check ' + - 'these before deploying your app):\n' - ) - ); - printBuildError(err); - } else { - console.log(chalk.red('Failed to compile.\n')); - printBuildError(err); - if (handler) handler(); - } -} - -// Create the production build and print the deployment instructions. -function build (config) { - if (process.env.NODE_ENV === 'development') { - console.log('Creating a development build...'); - } else { - console.log('Creating an optimized production build...'); - } - - return new Promise((resolve, reject) => { - const compiler = webpack(config); - compiler.run((err, stats) => { - err = details(err, stats, config.output.path); - if (err) { - reject(err); - } else { - resolve(); - } - }); - }); + console.log(chalk.red('Failed to compile.\n')); + console.log(err.message || err); + if (handler) handler(); } -// Create the build and watch for changes. -function watch (config) { - // Make sure webpack doesn't immediate bail on errors when watching. - config.bail = false; - if (process.env.NODE_ENV === 'development') { - console.log('Creating a development build and watching for changes...'); - } else { - console.log('Creating an optimized production build and watching for changes...'); - } - copyPublicFolder(config.output.path); - webpack(config).watch({}, (err, stats) => { - err = details(err, stats, config.output.path); - if (err) { - printErrorDetails(err); - } - console.log(); - }); +function buildArgs (opts) { + const args = ['--context', app.context]; + if (opts.production) args.push('--production'); + if (opts.watch) args.push('--watch'); + if (opts.isomorphic) args.push('--isomorphic'); + if (opts.locales) args.push('--locales', opts.locales); + if (opts.snapshot) args.push('--snapshot'); + if (opts.stats) args.push('--stats'); + if (!opts.animation) args.push('--no-animation'); + if (opts['content-hash']) args.push('--content-hash'); + if (opts.minify === false) args.push('--no-minify'); + if (opts.verbose) args.push('--verbose'); + if (!opts.linting) args.push('--no-linting'); + if (!opts['split-css']) args.push('--no-split-css'); + if (opts['externals-corejs'] || opts['externals-polyfill']) args.push('--externals-polyfill'); + if (opts.externals) args.push('--externals', opts.externals); + if (opts['externals-public']) args.push('--externals-public', opts['externals-public']); + if (opts.output) args.push('--output', opts.output); + if (opts.entry) args.push('--entry', opts.entry); + if (opts['ilib-additional-path']) args.push('--ilib-additional-path', opts['ilib-additional-path']); + if (opts['custom-skin']) args.push('--custom-skin'); + return args; } function api (opts = {}) { @@ -254,38 +122,62 @@ function api (opts = {}) { app.applyEnactMeta({template: path.join(__dirname, '..', 'config', 'custom-skin-template.ejs')}); } - // make the framework option available globally in order to be used by the eslint-webpack-plugin custom configuration process.env.FRAMEWORK = opts.framework; - // Do this as the first thing so that any code reading it knows the right env. - const configFactory = require('../config/webpack.config'); - const config = configFactory( - opts.production ? 'production' : 'development', - !opts.linting, - opts['content-hash'], - opts.isomorphic, - !opts.animation, - !opts['split-css'], - opts['ilib-additional-path'] - ); - // Set any entry path override - if (opts.entry || app.entry) helper.replaceEntry(config, opts.entry || app.entry); + if (opts.framework) { + if (process.env.NODE_ENV === 'development' || !opts.production) { + console.log('Creating a development framework build...'); + } else { + console.log('Creating an optimized production framework build...'); + } + const output = path.resolve(opts.output || path.join(app.context, 'dist')); + return fs.emptyDir(output).then(() => + spawnBunScript('build-framework.mjs', buildArgs({...opts, output}), {cwd: app.context}).then(() => { + console.log(chalk.green('Compiled successfully.')); + console.log(); + printFileSizes(output); + console.log(); + }) + ); + } + + if (opts.entry || app.entry) { + opts.entry = opts.entry || app.entry; + } - // Set any output path override - if (opts.output) config.output.path = path.resolve(opts.output); + if (opts.snapshot) { + opts.isomorphic = true; + } - mixins.apply(config, opts); + const output = path.resolve(opts.output || path.join(app.context, 'dist')); + + if (process.env.NODE_ENV === 'development' || !opts.production) { + console.log('Creating a development build...'); + } else { + console.log('Creating an optimized production build...'); + } - // Remove all content but keep the directory so that - // if you're in it, you don't end up in Trash - return fs.emptyDir(config.output.path).then(() => { - // Start the webpack build + return fs.emptyDir(output).then(() => { + const build = spawnBunScript('build.mjs', buildArgs({...opts, output}), {cwd: app.context}); if (opts.watch) { - // This will run infinitely until killed, even through errors - watch(config); - } else { - return build(config); + return build; } + return build.then(() => { + console.log(chalk.green('Compiled successfully.')); + if (!opts.production) { + console.log( + chalk.yellow( + 'NOTICE: This build contains debugging functionality and may run slower than in production mode.' + ) + ); + } + console.log(); + printFileSizes(output); + if (opts.stats && fs.existsSync(path.join(output, 'stats.html'))) { + console.log(chalk.cyan('Bundle analysis written to ') + chalk.underline(path.join(output, 'stats.html'))); + } + console.log(); + }); }); } @@ -299,6 +191,7 @@ function cli (args) { 'split-css', 'framework', 'externals-corejs', + 'externals-polyfill', 'stats', 'production', 'isomorphic', diff --git a/commands/serve.js b/commands/serve.js index 84619dd7..2cab3266 100755 --- a/commands/serve.js +++ b/commands/serve.js @@ -1,52 +1,13 @@ /* eslint no-console: off, no-undef: off */ /* eslint-env node, es6 */ -// @remove-on-eject-begin -/** - * Portions of this source code file are from create-react-app, used under the - * following MIT license: - * - * Copyright (c) 2013-present, Facebook, Inc. - * https://github.com/facebook/create-react-app - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ -// @remove-on-eject-end -const fs = require('fs'); const path = require('path'); const minimist = require('minimist'); -const clearConsole = require('react-dev-utils/clearConsole'); -const evalSourceMapMiddleware = require('react-dev-utils/evalSourceMapMiddleware'); -const getPublicUrlOrPath = require('react-dev-utils/getPublicUrlOrPath'); -const openBrowser = require('react-dev-utils/openBrowser'); -const redirectServedPathMiddleware = require('react-dev-utils/redirectServedPathMiddleware'); -const ignoredFiles = require('react-dev-utils/ignoredFiles'); -const {choosePort, createCompiler, prepareProxy, prepareUrls} = require('react-dev-utils/WebpackDevServerUtils'); -const ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin'); -const webpack = require('webpack'); -const WebpackDevServer = require('webpack-dev-server'); +const {choosePort} = require('react-dev-utils/WebpackDevServerUtils'); const {optionParser: app} = require('@enact/dev-utils'); +const {spawnBunScript} = require('../config/bun/spawn'); let chalk; -// Any unhandled promise rejections should be treated like errors. -process.on('unhandledRejection', err => { - throw err; -}); - -// As react-dev-utils assumes the webpack production packaging command is -// "npm run build" with no way to modify it yet, we provide a basic override -// to console.log to ensure the correct output is displayed to the user. -// prettier-ignore -console.log = (log => (data, ...rest) => { - if (typeof data === 'undefined') { - return log(); - } else if (typeof data === 'string') { - return log(data.replace(/npm run build/, 'npm run pack-p'), ...rest); - } - return log.call(this, data, ...rest); -})(console.log); - function displayHelp () { let e = 'node ' + path.relative(process.cwd(), __filename); if (require.main !== module) e = 'enact serve'; @@ -57,7 +18,7 @@ function displayHelp () { console.log(' Options'); console.log(' -b, --browser Automatically open browser'); console.log(' -i, --host Server host IP address'); - console.log(' -f, --fast Enables experimental frast refresh'); + console.log(' -f, --fast Enables experimental fast refresh'); console.log(' -p, --port Server port number'); console.log(' -m, --meta JSON to override package.json enact metadata'); console.log(' --no-linting Build without code linting'); @@ -67,259 +28,6 @@ function displayHelp () { process.exit(0); } -function hotDevServer (config, fastRefresh) { - // Keep webpack alive when there are any errors, so user can fix and rebuild. - config.bail = false; - // Ensure the CLI version of Chalk is used for webpackHotDevClient - // since tslint includes an out-of-date local version. - config.resolve.alias.chalk = require.resolve('chalk'); - config.resolve.alias['ansi-styles'] = require.resolve('ansi-styles'); - - // Include an alternative client for WebpackDevServer. A client's job is to - // connect to WebpackDevServer by a socket and get notified about changes. - // When you save a file, the client will either apply hot updates (in case - // of CSS changes), or refresh the page (in case of JS changes). When you - // make a syntax error, this client will display a syntax error overlay. - // Note: instead of the default WebpackDevServer client, we use a custom one - // to bring better experience. - if (!fastRefresh) { - config.entry.main.unshift(require.resolve('react-dev-utils/webpackHotDevClient')); - } else { - // Use experimental fast refresh plugin instead as dev client access point - // https://github.com/facebook/react/tree/master/packages/react-refresh - config.plugins.unshift( - new ReactRefreshWebpackPlugin({ - overlay: false - }) - ); - // Append fast refresh babel plugin - config.module.rules[1].oneOf[0].options.plugins = [require.resolve('react-refresh/babel')]; - } - return config; -} - -function devServerConfig (host, port, protocol, publicPath, proxy, allowedHost) { - let server = { - type: 'http' - }; - const {SSL_CRT_FILE, SSL_KEY_FILE} = process.env; - if (protocol === 'https' && [SSL_CRT_FILE, SSL_KEY_FILE].every(f => f && fs.existsSync(f))) { - server = { - type: 'https', - options: { - cert: fs.readFileSync(SSL_CRT_FILE), - key: fs.readFileSync(SSL_KEY_FILE) - } - }; - } - const disableFirewall = !proxy || process.env.DANGEROUSLY_DISABLE_HOST_CHECK === 'true'; - - return { - // WebpackDevServer 2.4.3 introduced a security fix that prevents remote - // websites from potentially accessing local content through DNS rebinding: - // https://github.com/webpack/webpack-dev-server/issues/887 - // https://medium.com/webpack/webpack-dev-server-middleware-security-issues-1489d950874a - // However, it made several existing use cases such as development in cloud - // environment or subdomains in development significantly more complicated: - // https://github.com/facebookincubator/create-react-app/issues/2271 - // https://github.com/facebookincubator/create-react-app/issues/2233 - // While we're investigating better solutions, for now we will take a - // compromise. Since our WDS configuration only serves files in the `public` - // folder we won't consider accessing them a vulnerability. However, if you - // use the `proxy` feature, it gets more dangerous because it can expose - // remote code execution vulnerabilities in backends like Django and Rails. - // So we will disable the host check normally, but enable it if you have - // specified the `proxy` setting. Finally, we let you override it if you - // really know what you're doing with a special environment variable. - // Note: ["localhost", ".localhost"] will support subdomains - but we might - // want to allow setting the allowedHosts manually for more complex setups - allowedHosts: disableFirewall ? 'all' : [allowedHost], - // Enable HTTPS if the HTTPS environment variable is set to 'true' - server, - host, - port, - // Allow cross-origin HTTP requests - headers: { - 'Access-Control-Allow-Origin': '*', - 'Access-Control-Allow-Methods': '*', - 'Access-Control-Allow-Headers': '*' - }, - static: [ - { - // By default WebpackDevServer serves physical files from current directory - // in addition to all the virtual build products that it serves from memory. - // This is confusing because those files won’t automatically be available in - // production build folder unless we copy them. However, copying the whole - // project directory is dangerous because we may expose sensitive files. - // Instead, we establish a convention that only files in `public` directory - // get served. Our build script will copy `public` into the `build` folder. - // In `index.html`, you can get URL of `public` folder with %PUBLIC_URL%: - // - // In JavaScript code, you can access it with `process.env.PUBLIC_URL`. - // Note that we only recommend to use `public` folder as an escape hatch - // for files like `favicon.ico`, `manifest.json`, and libraries that are - // for some reason broken when imported through webpack. If you just want to - // use an image, put it in `src` and `import` it from JavaScript instead. - directory: path.resolve(app.context, 'public'), - publicPath, - // By default files from `contentBase` will not trigger a page reload. - watch: { - // Reportedly, this avoids CPU overload on some systems. - // https://github.com/facebook/create-react-app/issues/293 - // src/node_modules is not ignored to support absolute imports - // https://github.com/facebook/create-react-app/issues/1065 - ignored: [ - ignoredFiles(path.resolve(app.context, 'src')), - '/node_modules[\\/](?!@enact[\\/](?!.*node_modules))/' - ] - } - }, - { - directory: path.resolve(app.context, '__mocks__'), - publicPath, - // By default files from `contentBase` will not trigger a page reload. - watch: { - // Reportedly, this avoids CPU overload on some systems. - // https://github.com/facebook/create-react-app/issues/293 - // src/node_modules is not ignored to support absolute imports - // https://github.com/facebook/create-react-app/issues/1065 - ignored: [ - ignoredFiles(path.resolve(app.context, 'src')), - '/node_modules[\\/](?!@enact[\\/](?!.*node_modules))/' - ] - } - } - ], - client: { - webSocketURL: { - // Enable custom sockjs pathname for websocket connection to hot reloading server. - // Enable custom sockjs hostname, pathname and port for websocket connection - // to hot reloading server. - hostname: process.env.WDS_SOCKET_HOST, - pathname: process.env.WDS_SOCKET_PATH, - port: process.env.WDS_SOCKET_PORT - }, - overlay: { - errors: true, - warnings: false, - runtimeErrors: false - } - }, - devMiddleware: { - // It is important to tell WebpackDevServer to use the same "publicPath" path as - // we specified in the webpack config. When homepage is '.', default to serving - // from the root. - // remove last slash so user can land on `/test` instead of `/test/` - publicPath: publicPath.slice(0, -1) - }, - historyApiFallback: { - // ensure JSON file requests correctly 404 error when not found. - rewrites: [{from: /.*\.json$/, to: context => context.parsedUrl.pathname}], - // Paths with dots should still use the history fallback. - // See https://github.com/facebookincubator/create-react-app/issues/387. - disableDotRule: true, - index: publicPath - }, - // `proxy` is run between `before` and `after` `webpack-dev-server` hooks - proxy, - setupMiddlewares (middlewares, devServer) { - if (!devServer) { - throw new Error('webpack-dev-server is not defined'); - } - - // Optionally register app-side proxy middleware if it exists - const proxySetup = path.join(process.cwd(), 'src', 'setupProxy.js'); - if (fs.existsSync(proxySetup)) { - require(proxySetup)(devServer.app); - } - - middlewares.unshift( - // Keep `evalSourceMapMiddleware` - // middlewares before `redirectServedPath` otherwise will not have any effect - // This lets us fetch source contents from webpack for the error overlay - evalSourceMapMiddleware(devServer) - ); - - middlewares.push( - // Redirect to `PUBLIC_URL` or `homepage`/`enact.publicUrl` from `package.json` - // if url not match - redirectServedPathMiddleware(publicPath) - ); - - return middlewares; - } - }; -} - -function serve (config, host, port, open) { - // We attempt to use the default port but if it is busy, we offer the user to - // run on a different port. `detect()` Promise resolves to the next free port. - return choosePort(host, port).then(resolvedPort => { - if (resolvedPort == null) { - // We have not found a port. - return Promise.reject(new Error('Could not find a free port for the dev-server.')); - } - const protocol = process.env.HTTPS === 'true' ? 'https' : 'http'; - const publicPath = getPublicUrlOrPath(true, app.publicUrl, process.env.PUBLIC_URL); - const urls = prepareUrls(protocol, host, resolvedPort, publicPath.slice(0, -1)); - - // Create a webpack compiler that is configured with custom messages. - const compiler = createCompiler({ - appName: app.name, - config, - urls, - useYarn: false, - useTypeScript: fs.existsSync('tsconfig.json'), - webpack - }); - // Hook into compiler to remove potentially confusing messages - compiler.hooks.afterEmit.tapAsync('EnactCLI', (compilation, callback) => { - compilation.warnings.forEach(w => { - if (w.message) { - // Remove any --fix ESLintinfo messages since the eslint-loader config is - // internal and eslist is used in an embedded context. - const eslintFix = /\n.* potentially fixable with the `--fix` option./gm; - w.message = w.message.replace(eslintFix, ''); - } - }); - callback(); - }); - // Load proxy config - const proxySetting = app.proxy; - const proxyConfig = prepareProxy(proxySetting, './public', publicPath); - // Serve webpack assets generated by the compiler over a web sever. - const serverConfig = Object.assign( - {}, - devServerConfig(host, resolvedPort, protocol, publicPath, proxyConfig, urls.lanUrlForConfig) - ); - const devServer = new WebpackDevServer(serverConfig, compiler); - // Launch WebpackDevServer. - devServer.startCallback(err => { - if (err) return console.log(err); - if (process.stdout.isTTY) clearConsole(); - console.log(chalk.cyan('Starting the development server...\n')); - if (open) { - openBrowser(urls.localUrlForBrowser); - } - }); - - ['SIGINT', 'SIGTERM'].forEach(sig => { - process.on(sig, () => { - devServer.stopCallback(() => {}); - process.exit(); - }); - }); - - if (process.env.CI !== 'true') { - // Gracefully exit when stdin ends - process.stdin.on('end', () => { - devServer.stopCallback(() => {}); - process.exit(); - }); - } - }); -} - function api (opts) { if (opts.meta) { let meta; @@ -331,28 +39,34 @@ function api (opts) { app.applyEnactMeta(meta); } - // We can disable the typechecker formatter since react-dev-utils includes their - // own formatter in their dev client. process.env.DISABLE_TSFORMATTER = 'true'; - - // Use inline styles for serving process. process.env.INLINE_STYLES = 'true'; + if (opts.fast) process.env.FAST_REFRESH = 'true'; - // Setup the development config with additional webpack-dev-server customizations. - const configFactory = require('../config/webpack.config'); - const fastRefresh = process.env.FAST_REFRESH || opts.fast; - const config = hotDevServer(configFactory('development', !opts.linting), fastRefresh); - - // Tools like Cloud9 rely on this. const host = process.env.HOST || opts.host || '0.0.0.0'; - const port = parseInt(process.env.PORT || opts.port || 8080); + const port = parseInt(process.env.PORT || opts.port || 8080, 10); - // Start serving if (['node', 'async-node', 'webworker'].includes(app.environment)) { return Promise.reject(new Error('Serving is not supported for non-browser apps.')); - } else { - return serve(config, host, port, opts.browser); } + + return choosePort(host, port).then(resolvedPort => { + if (resolvedPort == null) { + return Promise.reject(new Error('Could not find a free port for the dev-server.')); + } + + const protocol = process.env.HTTPS === 'true' ? 'https' : 'http'; + void protocol; + + console.log(chalk.cyan('Starting the development server...\n')); + + const args = ['--context', app.context, '--host', host, '--port', String(resolvedPort)]; + if (opts.browser) args.push('--browser'); + if (!opts.linting) args.push('--no-linting'); + if (opts.fast) args.push('--fast'); + + return spawnBunScript('dev-server.mjs', args, {cwd: app.context}); + }); } function cli (args) { @@ -369,7 +83,6 @@ function cli (args) { import('chalk').then(({default: _chalk}) => { chalk = _chalk; api(opts).catch(err => { - // console.error(chalk.red('ERROR: ') + (err.message || err)); console.log(err); process.exit(1); }); diff --git a/config/bun/build-framework.mjs b/config/bun/build-framework.mjs new file mode 100644 index 00000000..4909dc8f --- /dev/null +++ b/config/bun/build-framework.mjs @@ -0,0 +1,66 @@ +import path from 'path'; +import {fileURLToPath} from 'url'; +import {createRequire} from 'module'; +import {createBuildOptions} from './build-options.js'; +import {createEnactPlugins} from './plugins/index.js'; + +const require = createRequire(import.meta.url); +const {applyFramework} = require('./framework.js'); + +function parseArgs (argv) { + const opts = {production: false, output: null, context: null, snapshot: false, externalsPolyfill: false, linting: true}; + for (let i = 0; i < argv.length; i++) { + const arg = argv[i]; + if (arg === '--production' || arg === '-p') opts.production = true; + else if (arg === '--output' || arg === '-o') opts.output = argv[++i]; + else if (arg === '--context') opts.context = argv[++i]; + else if (arg === '--snapshot' || arg === '-s') opts.snapshot = true; + else if (arg === '--externals-polyfill') opts.externalsPolyfill = true; + else if (arg === '--no-linting') opts.linting = false; + } + return opts; +} + +async function run () { + const opts = parseArgs(process.argv.slice(2)); + const context = opts.context || process.cwd(); + process.chdir(context); + + const options = createBuildOptions({ + context, + production: opts.production, + output: opts.output || path.join(context, 'dist'), + linting: opts.linting + }); + const polyfillPath = opts.externalsPolyfill + ? path.join(path.dirname(fileURLToPath(import.meta.url)), '..', 'polyfills.js') + : null; + const plugins = createEnactPlugins({ + production: opts.production, + sourcemap: options.sourcemap, + context: options.context, + accent: options.accent, + forceCSSModules: options.forceCSSModules, + useTailwind: options.useTailwind, + ri: options.ri, + aliases: options.aliases, + linting: options.linting + }); + + const output = await applyFramework({ + context, + output: options.outputPath, + production: opts.production, + plugins, + polyfill: polyfillPath, + includeCoreJs: opts.externalsPolyfill && !polyfillPath, + snapshot: opts.snapshot + }); + + console.log(JSON.stringify({success: true, output})); +} + +run().catch(err => { + console.error(err); + process.exit(1); +}); diff --git a/config/bun/build-options.js b/config/bun/build-options.js new file mode 100644 index 00000000..6c75a363 --- /dev/null +++ b/config/bun/build-options.js @@ -0,0 +1,201 @@ +const fs = require('fs'); +const path = require('path'); +const {optionParser: app, configHelper: helper} = require('@enact/dev-utils'); +const {usesCustomSkinTemplate} = require('./generate-html'); +const {getIlibDefines} = require('./ilib-meta'); + +function loadProjectEnv (context, production) { + process.chdir(context); + process.env.NODE_ENV = production ? 'production' : 'development'; + require('../dotenv').load(context); + app.setEnactTargetsAsDefault(); +} + +function getMainEntry (context, entryOverride, isomorphic) { + if (entryOverride) { + return path.resolve(context, entryOverride); + } + if (isomorphic && typeof app.isomorphic === 'string') { + return path.resolve(context, app.isomorphic); + } + if (app.entry) { + return path.resolve(context, app.entry); + } + const pkg = JSON.parse(fs.readFileSync(path.join(context, 'package.json'), {encoding: 'utf8'})); + return path.resolve(context, pkg.main || 'src/index.js'); +} + +function getPublicPath (development) { + const getPublicUrlOrPath = require('react-dev-utils/getPublicUrlOrPath'); + return getPublicUrlOrPath(development, app.publicUrl, process.env.PUBLIC_URL).replace(/^\/$/, ''); +} + +function getCacheDir (context) { + return path.join(context, 'node_modules', '.cache', 'enact-bun'); +} + +function ensureEntryFile (context, mainEntry, options = {}) { + const {isomorphic, snapshot, fastRefresh} = options; + const cacheDir = getCacheDir(context); + fs.mkdirSync(cacheDir, {recursive: true}); + const polyfills = path.join(__dirname, '..', 'polyfills.js').replace(/\\/g, '/'); + const main = mainEntry.replace(/\\/g, '/'); + const entryPath = path.join(cacheDir, isomorphic ? 'entry-isomorphic.js' : 'entry.js'); + const lines = []; + + if (fastRefresh) { + lines.push( + "if (typeof window !== 'undefined') {", + "\tvar refreshRuntime = require('react-refresh/runtime');", + '\trefreshRuntime.injectIntoGlobalHook(window);', + '\twindow.$RefreshReg$ = function () {};', + '\twindow.$RefreshSig$ = function () { return function (type) { return type; }; };', + '}' + ); + } + + if (snapshot && isomorphic) { + const {resolveSnapshotHelper} = require('./plugins/snapshot-enact'); + lines.push( + `require(${JSON.stringify(resolveSnapshotHelper('snapshot-redux-helper'))});`, + `require(${JSON.stringify(resolveSnapshotHelper('snapshot-helper'))});` + ); + } + + lines.push(`require(${JSON.stringify(polyfills)});`); + + if (isomorphic) { + lines.push( + `var __enactApp = require(${JSON.stringify(main)});`, + `module.exports = __enactApp && __enactApp.__esModule ? __enactApp.default : __enactApp;` + ); + } else { + lines.push(`module.exports = require(${JSON.stringify(main)});`); + } + + fs.writeFileSync(entryPath, lines.join('\n'), {encoding: 'utf8'}); + return entryPath; +} + +function getResolveAliases (context) { + const aliases = { + 'react-is': path.dirname(require.resolve('react-is/package.json')) + }; + if (fs.existsSync(path.join(context, 'node_modules', '@enact', 'i18n', 'ilib'))) { + aliases.ilib = '@enact/i18n/ilib'; + } else { + aliases['@enact/i18n/ilib'] = 'ilib'; + } + if (app.alias) { + Object.assign(aliases, app.alias); + } + return aliases; +} + +function getDefines (opts = {}) { + const defines = { + 'process.env.NODE_ENV': JSON.stringify(opts.production ? 'production' : 'development'), + 'process.env.PUBLIC_URL': JSON.stringify(opts.publicPath || '/'), + ENACT_PACK_ISOMORPHIC: JSON.stringify(!!opts.isomorphic), + ENACT_PACK_NO_ANIMATION: JSON.stringify(!!opts.noAnimation) + }; + Object.keys(process.env) + .filter(key => /^(REACT_APP|WDS_SOCKET)/.test(key)) + .forEach(key => { + defines[`process.env.${key}`] = JSON.stringify(process.env[key]); + }); + + const ilibDefines = getIlibDefines(opts.context || app.context, opts.publicPath || '/', { + ilibAdditionalResourcesPath: opts.ilibAdditionalResourcesPath + }); + for (const [key, value] of Object.entries(ilibDefines)) { + defines[key] = value; + } + + return defines; +} + +function createBuildOptions (opts = {}) { + const context = opts.context || app.context; + loadProjectEnv(context, opts.production); + + if (opts.snapshot) { + opts.isomorphic = true; + } + + const mainEntry = getMainEntry(context, opts.entry, opts.isomorphic); + const useSnapshot = !!(opts.snapshot && !opts.externals); + const entryFile = ensureEntryFile(context, mainEntry, { + isomorphic: opts.isomorphic, + snapshot: useSnapshot, + fastRefresh: !!opts.fastRefresh + }); + const development = !opts.production; + const publicPath = getPublicPath(development); + const outputPath = path.resolve(opts.output || path.join(context, 'dist')); + const useTailwind = fs.existsSync(path.join(context, 'tailwind.config.js')); + const defines = getDefines({ + ...opts, + publicPath, + context, + ilibAdditionalResourcesPath: opts.ilibAdditionalResourcesPath + }); + const externalsPath = opts.externals || null; + const externalsPublic = opts['externals-public'] || opts.externalsPublic || null; + const template = app.template || path.join(__dirname, '..', 'html-template.ejs'); + const customSkin = !!(opts.customSkin || usesCustomSkinTemplate(template)); + + if (externalsPath && !process.env.ILIB_BASE_PATH) { + const {getFrameworkPublicPath} = require('./externals'); + const frameworkPublicPath = getFrameworkPublicPath(externalsPath, externalsPublic); + if (frameworkPublicPath) { + const ilibInEnact = path.join(frameworkPublicPath, 'node_modules', '@enact', 'i18n', 'ilib'); + const ilibStandalone = path.join(frameworkPublicPath, 'node_modules', 'ilib'); + process.env.ILIB_BASE_PATH = fs.existsSync(path.join(context, 'node_modules', '@enact', 'i18n', 'ilib')) + ? ilibInEnact.replace(/\\/g, '/') + : ilibStandalone.replace(/\\/g, '/'); + } + } + + return { + context, + mainEntry, + entryFile, + development, + publicPath, + outputPath, + useTailwind, + defines, + minify: opts.minify !== false && opts.production, + sourcemap: (process.env.GENERATE_SOURCEMAP || (opts.production ? 'false' : 'true')) !== 'false', + aliases: getResolveAliases(context), + isomorphic: !!opts.isomorphic, + snapshot: useSnapshot, + noAnimation: !!opts.noAnimation, + contentHash: !!opts.contentHash, + splitCss: opts.splitCss !== false, + linting: opts.linting !== false, + externalsPath, + externalsPublic, + externalsPolyfill: !!(opts.externalsPolyfill || opts['externals-corejs']), + ilibAdditionalResourcesPath: opts.ilibAdditionalResourcesPath, + forceCSSModules: !!app.forceCSSModules, + accent: app.accent, + ri: app.ri, + title: app.title || app.name || '', + template, + customSkin + }; +} + +module.exports = { + loadProjectEnv, + getMainEntry, + getPublicPath, + getCacheDir, + ensureEntryFile, + getResolveAliases, + getDefines, + createBuildOptions, + helper +}; diff --git a/config/bun/build.mjs b/config/bun/build.mjs new file mode 100644 index 00000000..e9595ac0 --- /dev/null +++ b/config/bun/build.mjs @@ -0,0 +1,336 @@ +import path from 'path'; +import {fileURLToPath} from 'url'; +import {createRequire} from 'module'; +import {createBuildOptions} from './build-options.js'; +import {writeIndexHtml} from './generate-html.js'; +import {createEnactPlugins} from './plugins/index.js'; +import {getIsomorphicExternals} from './plugins/isomorphic-enact.js'; + +const require = createRequire(import.meta.url); + +function parseArgs (argv) { + const opts = { + production: false, + watch: false, + output: null, + entry: null, + isomorphic: false, + noAnimation: false, + contentHash: false, + minify: true, + ilibAdditionalResourcesPath: null, + locales: null, + snapshot: false, + stats: false, + verbose: false, + externals: null, + externalsPublic: null, + customSkin: false, + linting: true, + splitCss: true, + externalsPolyfill: false + }; + for (let i = 0; i < argv.length; i++) { + const arg = argv[i]; + if (arg === '--production' || arg === '-p') opts.production = true; + else if (arg === '--watch' || arg === '-w') opts.watch = true; + else if (arg === '--isomorphic' || arg === '-i') opts.isomorphic = true; + else if (arg === '--no-animation') opts.noAnimation = true; + else if (arg === '--content-hash') opts.contentHash = true; + else if (arg === '--no-minify') opts.minify = false; + else if (arg === '--snapshot' || arg === '-s') opts.snapshot = true; + else if (arg === '--verbose') opts.verbose = true; + else if (arg === '--no-linting') opts.linting = false; + else if (arg === '--no-split-css') opts.splitCss = false; + else if (arg === '--externals-polyfill') opts.externalsPolyfill = true; + else if (arg === '--output' || arg === '-o') opts.output = argv[++i]; + else if (arg === '--entry') opts.entry = argv[++i]; + else if (arg === '--ilib-additional-path') opts.ilibAdditionalResourcesPath = argv[++i]; + else if (arg === '--locales' || arg === '-l') opts.locales = argv[++i]; + else if (arg === '--stats') opts.stats = true; + else if (arg === '--externals') opts.externals = argv[++i]; + else if (arg === '--externals-public') opts.externalsPublic = argv[++i]; + else if (arg === '--custom-skin') opts.customSkin = true; + else if (arg === '--context') opts.context = argv[++i]; + } + return opts; +} + +function normalizePath (filePath) { + return filePath.replace(/\\/g, '/'); +} + +function getOutputNaming (buildOpts) { + if (buildOpts.contentHash) { + return 'main.[hash].[ext]'; + } + if (!buildOpts.splitCss) { + return 'main.[ext]'; + } + return buildOpts.isomorphic ? 'main.[ext]' : '[name].[ext]'; +} + +function getIsomorphicExternalsList () { + return getIsomorphicExternals(); +} + +function createBuildConfig (buildOpts, options, plugins) { + const config = { + entrypoints: [normalizePath(options.entryFile)], + outdir: normalizePath(options.outputPath), + target: 'browser', + format: buildOpts.isomorphic ? 'cjs' : 'esm', + naming: getOutputNaming(buildOpts), + minify: options.minify, + sourcemap: options.sourcemap ? 'linked' : 'none', + define: options.defines, + publicPath: options.publicPath || '/', + plugins, + alias: options.aliases, + metafile: !!buildOpts.stats + }; + + if (buildOpts.isomorphic && !buildOpts.externals) { + config.external = getIsomorphicExternalsList(); + } + + if (buildOpts.verbose) { + console.log('Bun build configuration:'); + console.log(` entry: ${config.entrypoints[0]}`); + console.log(` outdir: ${config.outdir}`); + console.log(` format: ${config.format}`); + console.log(` naming: ${config.naming}`); + console.log(` minify: ${config.minify}`); + console.log(` sourcemap: ${config.sourcemap}`); + console.log(` publicPath: ${config.publicPath}`); + if (buildOpts.externals) { + console.log(` externals: ${buildOpts.externals}`); + if (buildOpts.externalsPublic) { + console.log(` externals-public: ${buildOpts.externalsPublic}`); + } + } + } + + return config; +} + +function getExternalHtmlAssets (buildOpts) { + if (!buildOpts.externals) return null; + const {getExternalAssets} = require('./externals.js'); + return getExternalAssets(buildOpts.externals, buildOpts.externalsPublic); +} + +function getStartupAssets (publicPath, jsName, buildOpts) { + const normalize = asset => asset.replace(/\/{2,}/g, '/'); + const assets = []; + + if (buildOpts.externals) { + const externalAssets = getExternalHtmlAssets(buildOpts); + if (externalAssets?.scripts) { + for (const script of externalAssets.scripts) { + assets.push(normalize(script)); + } + } + } else if (buildOpts.isomorphic) { + assets.push(normalize(`${publicPath}react-globals.js`)); + } + + assets.push(normalize(`${publicPath}${jsName}`)); + return assets; +} + +async function buildReactGlobals (options, buildOpts) { + const globalsEntry = path.join(path.dirname(fileURLToPath(import.meta.url)), 'react-globals-entry.js'); + const result = await Bun.build({ + entrypoints: [globalsEntry], + outdir: options.outputPath, + target: 'browser', + format: 'iife', + globalName: 'EnactReactGlobals', + naming: 'react-globals.[ext]', + minify: options.minify, + sourcemap: false, + define: options.defines, + alias: options.aliases + }); + if (!result.success) { + for (const log of result.logs) console.error(log); + throw new Error('Failed to build React globals for isomorphic mode.'); + } +} + +function finalizeBuild (result, buildOpts, options) { + if (!result.success) { + for (const log of result.logs) console.error(log); + return null; + } + + const jsOutput = result.outputs.find(o => o.path.endsWith('.js')); + const cssOutput = result.outputs.find(o => o.path.endsWith('.css')); + const jsName = jsOutput ? path.basename(jsOutput.path) : (buildOpts.isomorphic ? 'main.js' : 'entry.js'); + const cssName = cssOutput ? path.basename(cssOutput.path) : null; + const externalAssets = getExternalHtmlAssets(buildOpts); + + if (buildOpts.verbose) { + console.log('Build outputs:'); + for (const output of result.outputs) { + console.log(` ${path.basename(output.path)} (${output.kind}, ${output.size} bytes)`); + } + } + + writeIndexHtml(options.outputPath, { + title: options.title, + context: options.context, + publicPath: options.publicPath, + scriptSrc: `${options.publicPath}${jsName}`.replace(/\/{2,}/g, '/'), + cssHref: cssName ? `${options.publicPath}${cssName}`.replace(/\/{2,}/g, '/') : null, + isomorphic: buildOpts.isomorphic, + customSkin: options.customSkin, + externalScripts: externalAssets?.scripts, + externalStyles: externalAssets?.styles + }); + + require('./post-build.js').applyPostBuild(options.context, options.outputPath, { + publicPath: options.publicPath, + ilibAdditionalResourcesPath: options.ilibAdditionalResourcesPath, + customSkin: options.customSkin, + watch: buildOpts.watch + }); + + if (buildOpts.isomorphic) { + const app = require('@enact/dev-utils/option-parser'); + const applyBunPostBuild = require('./prerender.js').applyPrerender; + applyBunPostBuild({ + context: options.context, + output: options.outputPath, + chunk: jsName, + locales: buildOpts.locales || 'en-US', + publicPath: options.publicPath, + screenTypes: app.screenTypes, + deep: app.deep, + fontGenerator: app.fontGenerator, + externalStartup: app.externalStartup, + externals: buildOpts.externals, + startupAssets: getStartupAssets(options.publicPath, jsName, buildOpts) + }); + } + + let v8SnapshotFile; + if (buildOpts.snapshot) { + if (buildOpts.externals) { + const {getFrameworkPublicPath} = require('./externals.js'); + const frameworkPublicPath = getFrameworkPublicPath(buildOpts.externals, buildOpts.externalsPublic); + if (frameworkPublicPath) { + v8SnapshotFile = `${frameworkPublicPath}/snapshot_blob.bin`.replace(/\/{2,}/g, '/'); + } + } else { + require('./snapshot.js').applySnapshot({ + output: options.outputPath, + target: jsName + }); + v8SnapshotFile = 'snapshot_blob.bin'; + } + } + + if (v8SnapshotFile) { + require('./webos-meta.js').applyWebOSMeta(options.context, options.outputPath, { + v8SnapshotFile + }); + } + + if (buildOpts.stats) { + require('./generate-stats.js').writeStatsReport(options.outputPath, result.metafile); + } + + return {jsName, cssName}; +} + +function logBuildResult (buildOpts, options, info) { + console.log(JSON.stringify({ + success: true, + output: options.outputPath, + js: info.jsName, + css: info.cssName, + stats: !!buildOpts.stats, + watch: !!buildOpts.watch, + contentHash: !!buildOpts.contentHash, + externals: !!buildOpts.externals + })); +} + +async function runBuild (buildOpts) { + if (buildOpts.snapshot) { + buildOpts.isomorphic = true; + } + + const options = createBuildOptions(buildOpts); + const polyfillPath = options.externalsPolyfill + ? path.join(path.dirname(fileURLToPath(import.meta.url)), '..', 'polyfills.js') + : null; + const plugins = createEnactPlugins({ + production: buildOpts.production, + sourcemap: options.sourcemap, + context: options.context, + accent: options.accent, + forceCSSModules: options.forceCSSModules, + useTailwind: options.useTailwind, + ri: options.ri, + aliases: options.aliases, + isomorphic: buildOpts.isomorphic, + snapshot: options.snapshot, + linting: options.linting, + useExternals: !!buildOpts.externals, + externalsOptions: buildOpts.externals + ? { + polyfill: polyfillPath, + context: options.context, + local: require('./plugins/externals-enact').shouldEnableLocalExternals(options.context) + } + : undefined + }); + const buildConfig = createBuildConfig(buildOpts, options, plugins); + + if (buildOpts.isomorphic && !buildOpts.externals) { + await buildReactGlobals(options, buildOpts); + } + + if (buildOpts.watch) { + console.log('Watching for file changes...'); + + const result = await Bun.build({ + ...buildConfig, + watch: { + onRebuild (error, rebuildResult) { + if (error) { + console.error('Rebuild failed:', error); + return; + } + const info = finalizeBuild(rebuildResult, buildOpts, options); + if (info) { + console.log('Recompiled successfully.'); + logBuildResult(buildOpts, options, info); + } + } + } + }); + + const info = finalizeBuild(result, buildOpts, options); + if (!info) process.exit(1); + logBuildResult(buildOpts, options, info); + + await new Promise(() => {}); + return; + } + + const result = await Bun.build(buildConfig); + const info = finalizeBuild(result, buildOpts, options); + if (!info) process.exit(1); + logBuildResult(buildOpts, options, info); +} + +const cliOpts = parseArgs(process.argv.slice(2)); + +runBuild(cliOpts).catch(err => { + console.error(err); + process.exit(1); +}); diff --git a/config/bun/dev-proxy.js b/config/bun/dev-proxy.js new file mode 100644 index 00000000..23fd3e9f --- /dev/null +++ b/config/bun/dev-proxy.js @@ -0,0 +1,69 @@ +const fs = require('fs'); +const path = require('path'); +const {prepareProxy} = require('react-dev-utils/WebpackDevServerUtils'); + +function createProxyHandler (proxySetting, publicFolder, publicPath) { + const proxyConfig = prepareProxy(proxySetting, publicFolder, publicPath); + if (!proxyConfig) { + return null; + } + + const entry = Array.isArray(proxyConfig) ? proxyConfig[0] : proxyConfig; + const target = entry.target; + const contextFn = entry.context; + + return async function proxyRequest (req, pathname) { + if (typeof contextFn === 'function' && !contextFn(pathname, req)) { + return null; + } + + const targetUrl = new URL(pathname + new URL(req.url).search, target); + const headers = new Headers(req.headers); + if (headers.has('origin')) { + headers.set('origin', target); + } + + const init = { + method: req.method, + headers, + redirect: 'manual' + }; + + if (req.method !== 'GET' && req.method !== 'HEAD') { + init.body = req.body; + init.duplex = 'half'; + } + + const response = await fetch(targetUrl, init); + return new Response(response.body, { + status: response.status, + statusText: response.statusText, + headers: response.headers + }); + }; +} + +function shouldServeSpaIndex (req, pathname, publicFolder, publicPath) { + if (req.method !== 'GET') { + return false; + } + + const accept = req.headers.get('accept') || ''; + if (!accept.includes('text/html')) { + return false; + } + + if (pathname.includes('.')) { + const maybePublicPath = path.resolve( + publicFolder, + pathname.replace(new RegExp(`^${publicPath}`), '') + ); + if (fs.existsSync(maybePublicPath)) { + return false; + } + } + + return true; +} + +module.exports = {createProxyHandler, shouldServeSpaIndex}; diff --git a/config/bun/dev-serve-utils.js b/config/bun/dev-serve-utils.js new file mode 100644 index 00000000..5b9ed750 --- /dev/null +++ b/config/bun/dev-serve-utils.js @@ -0,0 +1,111 @@ +const fs = require('fs'); +const path = require('path'); +const {createRequire} = require('module'); + +function getTlsOptions () { + const {SSL_CRT_FILE, SSL_KEY_FILE} = process.env; + if (process.env.HTTPS === 'true' && SSL_CRT_FILE && SSL_KEY_FILE && + fs.existsSync(SSL_CRT_FILE) && fs.existsSync(SSL_KEY_FILE)) { + return { + cert: fs.readFileSync(SSL_CRT_FILE), + key: fs.readFileSync(SSL_KEY_FILE) + }; + } + return null; +} + +function getProtocol () { + return getTlsOptions() ? 'https' : 'http'; +} + +function normalizePublicPath (publicPath) { + if (!publicPath || publicPath === '/') return '/'; + return publicPath.endsWith('/') ? publicPath : `${publicPath}/`; +} + +function redirectPublicPath (pathname, publicPath) { + const normalized = normalizePublicPath(publicPath); + if (normalized === '/') return pathname; + if (pathname.startsWith(normalized)) { + return pathname.slice(normalized.length - 1) || '/'; + } + return pathname; +} + +function isAllowedHost (host, allowedHost, hasProxy) { + if (!hasProxy || process.env.DANGEROUSLY_DISABLE_HOST_CHECK === 'true') { + return true; + } + if (!host) return false; + return host === allowedHost || host.startsWith(`${allowedHost}:`); +} + +function createSetupProxyHandler (context) { + const setupProxy = path.join(context, 'src', 'setupProxy.js'); + if (!fs.existsSync(setupProxy)) { + return null; + } + + let createProxyMiddleware; + try { + createProxyMiddleware = require(require.resolve('http-proxy-middleware', {paths: [context]})); + } catch (e) { + console.warn('setupProxy.js found but http-proxy-middleware is not installed in the project.'); + return null; + } + + const stack = []; + const app = { + use (route, handler) { + if (typeof route === 'function') { + stack.push({route: null, handler: route}); + } else { + stack.push({route: route, handler}); + } + } + }; + + require(setupProxy)(app); + + return async function handleSetupProxy (req, pathname) { + for (const entry of stack) { + if (entry.route && !pathname.startsWith(entry.route)) { + continue; + } + if (typeof entry.handler === 'function' && entry.handler.name === 'handle') { + const targetUrl = new URL(req.url, 'http://localhost'); + const response = await fetch(new URL(pathname + targetUrl.search, 'http://localhost')); + if (response.status !== 404) { + return response; + } + } + } + return null; + }; +} + +function getDevOverlayScript () { + try { + const requireFromCli = createRequire(path.join(__dirname, '..', '..', 'package.json')); + const overlayPath = requireFromCli.resolve('react-error-overlay/lib/index'); + return [ + '' + ].join('\n'); + } catch (e) { + return ''; + } +} + +module.exports = { + getTlsOptions, + getProtocol, + redirectPublicPath, + isAllowedHost, + createSetupProxyHandler, + getDevOverlayScript +}; diff --git a/config/bun/dev-server.mjs b/config/bun/dev-server.mjs new file mode 100644 index 00000000..aac412c7 --- /dev/null +++ b/config/bun/dev-server.mjs @@ -0,0 +1,200 @@ +import path from 'path'; +import fs from 'fs'; +import {fileURLToPath} from 'url'; +import {createRequire} from 'module'; +import {createBuildOptions, getCacheDir, ensureEntryFile} from './build-options.js'; +import {writeDevHtml} from './generate-html.js'; +import {createEnactPlugins} from './plugins/index.js'; +import {createProxyHandler, shouldServeSpaIndex} from './dev-proxy.js'; +import { + getTlsOptions, + getProtocol, + redirectPublicPath, + isAllowedHost, + createSetupProxyHandler +} from './dev-serve-utils.js'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const require = createRequire(import.meta.url); + +function parseArgs (argv) { + const opts = { + host: '0.0.0.0', + port: 8080, + open: false, + linting: true, + fast: false + }; + for (let i = 0; i < argv.length; i++) { + const arg = argv[i]; + if (arg === '--host' || arg === '-i') opts.host = argv[++i]; + else if (arg === '--port' || arg === '-p') opts.port = parseInt(argv[++i], 10); + else if (arg === '--browser' || arg === '-b') opts.open = true; + else if (arg === '--context') opts.context = argv[++i]; + else if (arg === '--no-linting') opts.linting = false; + else if (arg === '--fast' || arg === '-f') opts.fast = true; + } + return opts; +} + +async function runBuild (buildOpts, entryFile, plugins, cacheDir) { + const result = await Bun.build({ + entrypoints: [entryFile], + outdir: cacheDir, + target: 'browser', + minify: false, + sourcemap: buildOpts.sourcemap ? 'linked' : 'none', + define: buildOpts.defines, + publicPath: buildOpts.publicPath || '/', + plugins, + alias: buildOpts.aliases + }); + if (!result.success) { + for (const log of result.logs) console.error(log); + throw new Error('Dev build failed.'); + } + return result; +} + +const cliOpts = parseArgs(process.argv.slice(2)); +process.env.INLINE_STYLES = 'true'; +if (cliOpts.fast) { + process.env.FAST_REFRESH = 'true'; +} + +const buildOpts = createBuildOptions({ + context: cliOpts.context, + production: false, + linting: cliOpts.linting, + fastRefresh: cliOpts.fast +}); +const cacheDir = getCacheDir(buildOpts.context); +fs.mkdirSync(cacheDir, {recursive: true}); + +const app = require('@enact/dev-utils/option-parser'); +const entryFile = ensureEntryFile(buildOpts.context, buildOpts.mainEntry, { + isomorphic: false, + snapshot: false, + fastRefresh: cliOpts.fast +}); +const plugins = createEnactPlugins({ + production: false, + sourcemap: buildOpts.sourcemap, + context: buildOpts.context, + accent: buildOpts.accent, + forceCSSModules: buildOpts.forceCSSModules, + useTailwind: buildOpts.useTailwind, + ri: buildOpts.ri, + aliases: buildOpts.aliases, + linting: cliOpts.linting, + fastRefresh: cliOpts.fast +}); + +await runBuild(buildOpts, entryFile, plugins, cacheDir); +writeDevHtml(cacheDir, {title: buildOpts.title, publicPath: buildOpts.publicPath, customSkin: buildOpts.customSkin}); + +const publicDir = path.join(buildOpts.context, 'public'); +const mocksDir = path.join(buildOpts.context, '__mocks__'); +const publicPath = buildOpts.publicPath || '/'; +const proxyHandler = createProxyHandler(app.proxy, publicDir, publicPath); +const setupProxyHandler = createSetupProxyHandler(buildOpts.context); +const tls = getTlsOptions(); +const allowedHost = cliOpts.host === '0.0.0.0' ? 'localhost' : cliOpts.host; + +const server = Bun.serve({ + hostname: cliOpts.host, + port: cliOpts.port, + tls, + development: { + hmr: true, + console: true + }, + async fetch (req) { + const url = new URL(req.url); + if (!isAllowedHost(url.hostname, allowedHost, !!app.proxy)) { + return new Response('Invalid Host header', {status: 403}); + } + + let pathname = decodeURIComponent(url.pathname); + pathname = redirectPublicPath(pathname, publicPath); + + if (pathname === '/' || pathname === '/index.html') { + return new Response(Bun.file(path.join(cacheDir, 'index.html')), { + headers: { + 'Content-Type': 'text/html; charset=utf-8', + 'Access-Control-Allow-Origin': '*' + } + }); + } + + for (const dir of [cacheDir, publicDir, mocksDir]) { + if (!fs.existsSync(dir)) continue; + const candidate = path.join(dir, pathname.replace(/^\//, '')); + if (candidate.startsWith(dir) && fs.existsSync(candidate) && fs.statSync(candidate).isFile()) { + return new Response(Bun.file(candidate), { + headers: {'Access-Control-Allow-Origin': '*'} + }); + } + } + + if (setupProxyHandler) { + const setupResponse = await setupProxyHandler(req, pathname); + if (setupResponse) { + return setupResponse; + } + } + + if (proxyHandler) { + const proxied = await proxyHandler(req, pathname); + if (proxied) { + return proxied; + } + } + + if (shouldServeSpaIndex(req, pathname, publicDir, publicPath)) { + return new Response(Bun.file(path.join(cacheDir, 'index.html')), { + headers: { + 'Content-Type': 'text/html; charset=utf-8', + 'Access-Control-Allow-Origin': '*' + } + }); + } + + return new Response('Not Found', {status: 404}); + } +}); + +Bun.build({ + entrypoints: [entryFile], + outdir: cacheDir, + target: 'browser', + minify: false, + sourcemap: buildOpts.sourcemap ? 'linked' : 'none', + define: buildOpts.defines, + publicPath: buildOpts.publicPath || '/', + plugins, + alias: buildOpts.aliases, + watch: { + onRebuild (error) { + if (error) { + console.error('Rebuild failed:', error); + } else { + console.log('Rebuilt.'); + } + } + } +}); + +const protocol = getProtocol(); +const localUrl = `${protocol}://localhost:${server.port}${normalizePublicPath(publicPath)}`; +console.log(`Starting the development server at ${localUrl}`); + +if (cliOpts.open) { + const openBrowser = require('react-dev-utils/openBrowser'); + openBrowser(localUrl); +} + +function normalizePublicPath (value) { + if (!value || value === '/') return '/'; + return value.endsWith('/') ? value : `${value}/`; +} diff --git a/config/bun/externals.js b/config/bun/externals.js new file mode 100644 index 00000000..08107290 --- /dev/null +++ b/config/bun/externals.js @@ -0,0 +1,50 @@ +const path = require('path'); + +const FRAMEWORK_LIBRARIES = [ + 'react', + 'react-dom', + 'react-dom/client', + 'react-dom/server', + 'react-is', + 'ilib', + '@enact/core', + '@enact/i18n', + '@enact/spotlight', + '@enact/ui' +]; + +function normalizePublicPath (publicPath) { + if (!publicPath || publicPath === '/') return ''; + const normalized = publicPath.replace(/\\/g, '/'); + return normalized.endsWith('/') ? normalized.slice(0, -1) : normalized; +} + +function getFrameworkPublicPath (externalsPath, externalsPublic) { + if (externalsPublic) { + return normalizePublicPath(externalsPublic); + } + if (!externalsPath) return null; + return normalizePublicPath(path.relative(process.cwd(), path.resolve(externalsPath)).replace(/\\/g, '/')); +} + +function getExternalAssets (externalsPath, externalsPublic) { + const publicPath = getFrameworkPublicPath(externalsPath, externalsPublic); + if (!publicPath) return null; + + return { + publicPath, + scripts: [`${publicPath}/enact.js`], + styles: [`${publicPath}/enact.css`] + }; +} + +function getExternalPackages () { + return [...FRAMEWORK_LIBRARIES]; +} + +module.exports = { + FRAMEWORK_LIBRARIES, + getExternalAssets, + getExternalPackages, + getFrameworkPublicPath +}; diff --git a/config/bun/framework.js b/config/bun/framework.js new file mode 100644 index 00000000..15918d60 --- /dev/null +++ b/config/bun/framework.js @@ -0,0 +1,293 @@ +const fs = require('fs'); +const path = require('path'); + +const fastGlob = require(require.resolve('fast-glob', { + paths: [path.dirname(require.resolve('@enact/dev-utils/package.json'))] +})); +const packageRoot = require('@enact/dev-utils/package-root'); + +const ROOT_PACKAGES = [ + 'react', + 'react-dom', + 'react-dom/client', + 'react-dom/server', + 'react/jsx-runtime', + 'react/jsx-dev-runtime' +]; + +const FRAMEWORK_IGNORE = [ + '**/webpack.config.js', + '**/eslint.config.js', + '**/karma.conf.js', + '**/build/**/*.*', + '**/dist/**/*.*', + '**/@enact/dev-utils/**/*.*', + '**/@enact/docs-utils/**/*.*', + '**/@enact/storybook-utils/**/*.*', + '**/@enact/ui-test-utils/**/*.*', + '**/@enact/screenshot-test-utils/**/*.*', + '**/samples/**/*.*', + '**/tests/**/*.*' +]; + +function getModuleId (nodeModules, file) { + const absPath = path.join(nodeModules, file); + let dir = absPath; + + while (dir.startsWith(nodeModules) && dir.length > nodeModules.length) { + const pkgPath = path.join(dir, 'package.json'); + if (fs.existsSync(pkgPath)) { + try { + const pkg = JSON.parse(fs.readFileSync(pkgPath, {encoding: 'utf8'})); + if (pkg.main) { + const mainPath = path.resolve(dir, pkg.main); + if (path.resolve(absPath) === mainPath) { + return path.relative(nodeModules, dir).replace(/\\/g, '/'); + } + } + } catch (e) { + // ignore invalid package.json + } + if (/[/\\]index\.(js|jsx|es6)$/.test(absPath)) { + return path.relative(nodeModules, dir).replace(/\\/g, '/'); + } + } + dir = path.dirname(dir); + } + + let id = file.replace(/\.(jsx|es6|js)$/, '').replace(/\\/g, '/'); + if (id.endsWith('/index') && id.length > 6) { + id = id.slice(0, -6); + } + return id; +} + +function getPolyfillModules (context, polyfillPath) { + if (!polyfillPath) return []; + const modules = [{id: '@enact/polyfills', request: polyfillPath}]; + return modules; +} + +function getCoreJsModules () { + try { + const coreJsRoot = path.dirname(require.resolve('core-js/package.json')); + return fastGlob.sync('modules/**/*.js', {cwd: coreJsRoot, absolute: true}).map(file => ({ + id: path.relative(coreJsRoot, file).replace(/\\/g, '/').replace(/\.js$/, ''), + request: file + })); + } catch (e) { + return []; + } +} + +function getThemeLocalModules (context) { + process.chdir(context); + const app = packageRoot(); + if ( + !app.meta.name.startsWith('@enact/') || + !( + fs.existsSync(path.join(app.path, 'MoonstoneDecorator')) || + fs.existsSync(path.join(app.path, 'ThemeDecorator')) || + app.meta.name === '@enact/i18n' + ) + ) { + return []; + } + + return fastGlob + .sync('**/*.@(js|jsx|es6)', { + cwd: app.path, + onlyFiles: true, + ignore: [ + '!node_modules', + '!samples', + '!dist', + '!build', + '!resources', + '!coverage', + '!tests', + '**/__tests__/**/*.{js,jsx,ts,tsx}', + '**/?(*.)+(spec|test).[jt]s?(x)', + '**/*-specs.{js,jsx,ts,tsx}' + ] + }) + .map(file => { + const abs = path.resolve(app.path, file); + let id = file.replace(/\.(jsx|es6|js)$/, '').replace(/\\/g, '/'); + if (id.endsWith('/index') && id.length > 6) { + id = id.slice(0, -6); + } + id = id.replace(/^\.\//, app.meta.name + '/'); + return {id, request: abs}; + }); +} + +function getFrameworkModuleRequests (context, options = {}) { + const nodeModules = path.join(context, 'node_modules'); + const enactFiles = fastGlob.sync('@enact/**/*.@(js|jsx|es6)', { + cwd: nodeModules, + onlyFiles: true, + ignore: FRAMEWORK_IGNORE, + followSymbolicLinks: true + }); + + const modules = new Map(); + for (const pkg of ROOT_PACKAGES) { + modules.set(pkg, pkg); + } + for (const file of enactFiles) { + const id = getModuleId(nodeModules, file); + if (!modules.has(id)) { + modules.set(id, id); + } + } + + for (const {id, request} of getThemeLocalModules(context)) { + modules.set(id, request); + } + + if (options.polyfill) { + for (const {id, request} of getPolyfillModules(context, options.polyfill)) { + modules.set(id, request); + } + } else if (options.includeCoreJs) { + for (const {id, request} of getCoreJsModules()) { + modules.set(id, request); + } + } + + return [...modules.entries()].map(([id, request]) => ({id, request})); +} + +function writeFrameworkEntry (context, modules, options = {}) { + const cacheDir = path.join(context, 'node_modules', '.cache', 'enact-bun'); + fs.mkdirSync(cacheDir, {recursive: true}); + const entryPath = path.join(cacheDir, 'framework-entry.js'); + const lines = [ + 'var __registry = Object.create(null);', + 'function __register(id, loader) { __registry[id] = loader; }', + '' + ]; + + if (options.polyfill) { + const polyfillPath = options.polyfill.replace(/\\/g, '/'); + lines.push(`__register('@enact/polyfills', function () { return require(${JSON.stringify(polyfillPath)}); });`); + } + + for (const {id, request} of modules) { + lines.push(`__register(${JSON.stringify(id)}, function () { return require(${JSON.stringify(request)}); });`); + } + + lines.push('', '// Eagerly load framework modules for CSS extraction'); + for (const {request} of modules) { + lines.push(`require(${JSON.stringify(request)});`); + } + + lines.push( + '', + 'function enact_framework(id) {', + '\tvar loader = __registry[id];', + '\tif (!loader) throw new Error(\'Cannot find enact framework module \' + id);', + '\treturn loader();', + '}', + 'enact_framework.require = enact_framework;', + 'module.exports = enact_framework;', + '' + ); + + fs.writeFileSync(entryPath, lines.join('\n'), {encoding: 'utf8'}); + return entryPath; +} + +function wrapFrameworkBundle (code) { + const body = code.replace(/^\uFEFF?#![^\n]*\n/, ''); + return [ + '(function (root, factory) {', + '\tif (typeof module === \'object\' && typeof module.exports !== \'undefined\') {', + '\t\tmodule.exports = factory(root, typeof require === \'function\' ? require : null);', + '\t} else {', + '\t\troot.enact_framework = factory(root, null);', + '\t}', + '})(typeof self !== \'undefined\' ? self : this, function (root, nodeRequire) {', + '\tvar exports = {};', + '\tvar module = { exports: exports };', + '\tvar require = nodeRequire || function () {', + '\t\tthrow new Error(\'Enact framework requires a runtime require() implementation.\');', + '\t};', + '\t(function () {', + body, + '\t})();', + '\tvar framework = module.exports;', + '\tif (typeof framework === \'function\') {', + '\t\tframework.require = framework.require || framework;', + '\t}', + '\treturn framework;', + '});', + '' + ].join('\n'); +} + +async function applyFramework (options = {}) { + const context = path.resolve(options.context || process.cwd()); + const output = path.resolve(options.output || path.join(context, 'dist')); + const polyfillPath = options.polyfill + ? path.join(__dirname, '..', 'polyfills.js') + : null; + const modules = getFrameworkModuleRequests(context, { + polyfill: polyfillPath, + includeCoreJs: !!options.includeCoreJs && !polyfillPath + }); + + if (modules.length === 0) { + throw new Error('Framework build: no @enact entries found.'); + } + + fs.mkdirSync(output, {recursive: true}); + const entryPath = writeFrameworkEntry(context, modules, {polyfill: polyfillPath}); + const plugins = options.plugins || []; + const result = await Bun.build({ + entrypoints: [entryPath.replace(/\\/g, '/')], + outdir: output, + target: 'browser', + format: 'cjs', + naming: 'enact.[ext]', + minify: !!options.production, + sourcemap: options.production ? 'none' : 'linked', + plugins + }); + + if (!result.success) { + for (const log of result.logs) console.error(log); + throw new Error('Framework build failed.'); + } + + const jsOutput = result.outputs.find(outputFile => outputFile.path.endsWith('.js')); + const cssOutput = result.outputs.find(outputFile => outputFile.path.endsWith('.css')); + if (jsOutput) { + const code = fs.readFileSync(jsOutput.path, {encoding: 'utf8'}); + fs.writeFileSync(jsOutput.path, wrapFrameworkBundle(code), {encoding: 'utf8'}); + } + if (cssOutput && path.basename(cssOutput.path) !== 'enact.css') { + const enactCss = path.join(output, 'enact.css'); + fs.copyFileSync(cssOutput.path, enactCss); + if (cssOutput.path !== enactCss) { + fs.unlinkSync(cssOutput.path); + } + } + + if (options.snapshot) { + require('./snapshot.js').applySnapshot({ + output, + target: 'enact.js' + }); + } + + return output; +} + +module.exports = { + applyFramework, + getFrameworkModuleRequests, + getModuleId, + wrapFrameworkBundle +}; diff --git a/config/bun/generate-html.js b/config/bun/generate-html.js new file mode 100644 index 00000000..8b9869a0 --- /dev/null +++ b/config/bun/generate-html.js @@ -0,0 +1,90 @@ +const fs = require('fs'); +const path = require('path'); + +const CUSTOM_SKIN_JS = 'customizations/custom_skin.js'; +const CUSTOM_SKIN_CSS = 'customizations/custom_skin.css'; + +function usesCustomSkinTemplate (templatePath) { + return !!(templatePath && /custom-skin-template\.ejs$/i.test(path.basename(templatePath))); +} + +function getCustomSkinHeadHtml () { + return [ + `\n\t\t`, + `\t\t` + ].join('\n'); +} + +function readWebOSTitle (context) { + const roots = [context, path.join(context, 'webos-meta')]; + for (const root of roots) { + const appinfoPath = path.join(root, 'appinfo.json'); + if (fs.existsSync(appinfoPath)) { + try { + const appinfo = JSON.parse(fs.readFileSync(appinfoPath, {encoding: 'utf8'})); + if (appinfo.title) return appinfo.title; + } catch (e) { + // ignore parse errors + } + } + } + return null; +} + +function renderHtml ({title, publicPath, scriptSrc, cssHref, isomorphic, externalScripts, externalStyles, customSkin}) { + const customSkinHead = customSkin ? getCustomSkinHeadHtml() : ''; + const externalCss = (externalStyles || []) + .map(href => `\n\t\t`) + .join(''); + const css = cssHref ? `\n\t\t` : ''; + const externalJs = !isomorphic && (externalScripts || []) + .map(src => `\n\t\t`) + .join(''); + const scriptType = isomorphic ? 'text/javascript' : 'module'; + const appScript = scriptSrc && !isomorphic + ? `\n\t\t` + : ''; + const bodyScripts = externalJs + appScript; + + return ` + + + + + + ${title || ''}${customSkinHead}${externalCss}${css} + + +
${bodyScripts} + + +`; +} + +function writeIndexHtml (outputDir, options) { + fs.mkdirSync(outputDir, {recursive: true}); + const title = options.title || readWebOSTitle(options.context) || ''; + const html = renderHtml({...options, title}); + const target = path.join(outputDir, 'index.html'); + fs.writeFileSync(target, html, {encoding: 'utf8'}); + return target; +} + +function writeDevHtml (cacheDir, options) { + fs.mkdirSync(cacheDir, {recursive: true}); + const overlay = require('./dev-serve-utils').getDevOverlayScript(); + const html = renderHtml({...options, scriptSrc: './entry.js'}).replace('', `${overlay}\n\t`); + const target = path.join(cacheDir, 'index.html'); + fs.writeFileSync(target, html, {encoding: 'utf8'}); + return target; +} + +module.exports = { + renderHtml, + writeIndexHtml, + writeDevHtml, + usesCustomSkinTemplate, + getCustomSkinHeadHtml, + CUSTOM_SKIN_JS, + CUSTOM_SKIN_CSS +}; diff --git a/config/bun/generate-stats.js b/config/bun/generate-stats.js new file mode 100644 index 00000000..dcd4127c --- /dev/null +++ b/config/bun/generate-stats.js @@ -0,0 +1,136 @@ +const fs = require('fs'); +const path = require('path'); + +function formatBytes (bytes) { + if (!bytes) return '0 B'; + const k = 1024; + const sizes = ['B', 'KB', 'MB', 'GB']; + const i = Math.min(Math.floor(Math.log(bytes) / Math.log(k)), sizes.length - 1); + return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`; +} + +function escapeHtml (value) { + return String(value) + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"'); +} + +function basename (filePath) { + return filePath.split(/[/\\]/).pop() || filePath; +} + +function buildInputRows (inputs, limit = 100) { + const maxBytes = inputs[0]?.bytes || 1; + return inputs.slice(0, limit).map(({file, bytes}) => { + const width = Math.max(2, Math.round((bytes / maxBytes) * 100)); + return ` + ${escapeHtml(file)} + ${formatBytes(bytes)} + +`; + }).join('\n'); +} + +function buildOutputSections (outputs, metafile) { + return outputs.map(({file, bytes}) => { + const outputMeta = metafile.outputs[file] || {}; + const contributors = Object.entries(outputMeta.inputs || {}) + .map(([inputPath, info]) => ({ + file: inputPath, + bytes: info.bytesInOutput || 0 + })) + .sort((a, b) => b.bytes - a.bytes) + .slice(0, 25); + + const rows = contributors.map(({file: inputPath, bytes: inputBytes}) => + `${escapeHtml(inputPath)}${formatBytes(inputBytes)}` + ).join('\n'); + + return `
+

${escapeHtml(basename(file))} ${formatBytes(bytes)}

+ + + ${rows || ''} +
Input moduleBytes in output
No module details available.
+
`; + }).join('\n'); +} + +function renderStatsHtml (metafile) { + const inputs = Object.entries(metafile.inputs || {}) + .map(([file, meta]) => ({file, bytes: meta.bytes || 0})) + .sort((a, b) => b.bytes - a.bytes); + + const outputs = Object.entries(metafile.outputs || {}) + .map(([file, meta]) => ({file, bytes: meta.bytes || 0})) + .sort((a, b) => b.bytes - a.bytes); + + const totalInput = inputs.reduce((sum, item) => sum + item.bytes, 0); + const totalOutput = outputs.reduce((sum, item) => sum + item.bytes, 0); + + return ` + + + + + Enact Bundle Analysis + + + +
+

Enact Bundle Analysis

+

Generated from Bun metafile data.

+
+ For an interactive treemap, open esbuild.github.io/analyze + and upload stats.json from this directory. +
+
+
Input modules${inputs.length}
+
Total input size${formatBytes(totalInput)}
+
Output files${outputs.length}
+
Total output size${formatBytes(totalOutput)}
+
+
+

Largest input modules

+ + + ${buildInputRows(inputs)} +
ModuleSizeRelative size
+
+ ${buildOutputSections(outputs, metafile)} +
+ +`; +} + +function writeStatsReport (outputDir, metafile) { + if (!metafile) { + throw new Error('Unable to generate bundle analysis: Bun build did not return a metafile.'); + } + + fs.mkdirSync(outputDir, {recursive: true}); + fs.writeFileSync(path.join(outputDir, 'stats.json'), JSON.stringify(metafile, null, 2), {encoding: 'utf8'}); + fs.writeFileSync(path.join(outputDir, 'stats.html'), renderStatsHtml(metafile), {encoding: 'utf8'}); +} + +module.exports = {writeStatsReport, formatBytes}; diff --git a/config/bun/ilib-meta.js b/config/bun/ilib-meta.js new file mode 100644 index 00000000..571d9520 --- /dev/null +++ b/config/bun/ilib-meta.js @@ -0,0 +1,160 @@ +const fs = require('fs-extra'); +const path = require('path'); +const glob = require('glob'); +const app = require('@enact/dev-utils/option-parser'); + +function packageSearch (dir, pkg) { + if (!path.isAbsolute(dir)) dir = path.join(process.cwd(), dir); + while (dir.length > 0 && dir !== path.dirname(dir)) { + const full = path.join(dir, 'node_modules', pkg); + if (fs.existsSync(full)) { + return path.relative(process.cwd(), full).replace(/\\/g, '/'); + } + dir = path.dirname(dir); + } + return null; +} + +function transformPath (context, file) { + return path + .relative(context, file) + .replace(/\\/g, '/') + .replace(/\.\.(\/)?/g, '_$1'); +} + +function bundleConst (name) { + return ( + 'ILIB_' + + path.basename(name).toUpperCase().replace(/[-_\s]/g, '_') + + '_PATH' + ); +} + +function resolveBundlePath ({dir, context, publicPath, relative}) { + if (path.isAbsolute(dir)) { + return JSON.stringify(dir.replace(/\\/g, '/')); + } + const full = fs.existsSync(path.join(context, dir)) ? path.join(context, dir) : dir; + if (relative) { + return JSON.stringify(transformPath(context, full)); + } + return JSON.stringify(path.join(publicPath || '/', transformPath(context, full)).replace(/\\/g, '/')); +} + +function findIlibPath (context) { + return ( + packageSearch(context, path.join('@enact', 'i18n', 'ilib')) || + packageSearch(context, 'ilib') || + (fs.existsSync(path.join(context, 'ilib')) && 'ilib') + ); +} + +function readManifestFiles (manifestPath) { + if (!fs.existsSync(manifestPath)) return []; + const data = JSON.parse(fs.readFileSync(manifestPath, {encoding: 'utf8'})); + return data.files || []; +} + +function emitManifestAssets (context, output, manifestPath, cache) { + const dir = path.dirname(manifestPath); + const relManifest = transformPath(context, manifestPath); + const outManifest = path.join(output, relManifest); + fs.ensureDirSync(path.dirname(outManifest)); + + if (!cache || !fs.existsSync(outManifest) || fs.statSync(manifestPath).mtimeMs > fs.statSync(outManifest).mtimeMs) { + fs.copySync(manifestPath, outManifest, {dereference: true}); + } + + for (const file of readManifestFiles(manifestPath)) { + const src = path.join(dir, file); + const dest = path.join(output, transformPath(context, src)); + if (!fs.existsSync(src)) continue; + fs.ensureDirSync(path.dirname(dest)); + if (!cache || !fs.existsSync(dest) || fs.statSync(src).mtimeMs > fs.statSync(dest).mtimeMs) { + fs.copySync(src, dest, {dereference: true}); + } + } +} + +function ensureManifest (manifestPath, create) { + if (fs.existsSync(manifestPath)) return manifestPath; + const dir = path.dirname(manifestPath); + let files = []; + if (fs.existsSync(dir)) { + files = glob.sync('./**/!(appinfo).json', {cwd: dir, onlyFiles: true}).map(f => f.replace(/^\.\//, '')); + } + if (create) { + fs.ensureDirSync(dir); + fs.writeFileSync(manifestPath, JSON.stringify({files}, null, '\t') + '\n', {encoding: 'utf8'}); + } + return manifestPath; +} + +function getIlibDefines (context, publicPath, options = {}) { + const ilibDir = options.ilib || findIlibPath(context); + if (!ilibDir) return {}; + + const defines = { + ILIB_BASE_PATH: resolveBundlePath({dir: ilibDir, context, publicPath}), + ILIB_RESOURCES_PATH: resolveBundlePath({dir: options.resources || 'resources', context, publicPath}), + ILIB_CACHE_ID: JSON.stringify(String(Date.now())), + ILIB_NO_ASSETS: JSON.stringify(false) + }; + + if (options.ilibAdditionalResourcesPath) { + defines.ILIB_ADDITIONAL_RESOURCES_PATH = JSON.stringify(options.ilibAdditionalResourcesPath.replace(/\\/g, '/')); + } + + defines[bundleConst(app.name || 'app')] = defines.ILIB_RESOURCES_PATH; + + let pkgDir = context; + for (let t = app.theme; t; t = t.theme) { + const themeDir = packageSearch(pkgDir, t.name); + if (themeDir) { + defines[bundleConst(t.name)] = resolveBundlePath({ + dir: path.join(themeDir, 'resources'), + context, + publicPath + }); + pkgDir = path.dirname(path.join(context, themeDir)); + } + } + + return defines; +} + +function applyIlibResources (context, output, options = {}) { + const ilibDir = options.ilib || findIlibPath(context); + if (!ilibDir) return; + + const create = options.create !== false; + const cache = options.cache !== false; + const manifests = []; + + const ilibPath = path.join(context, ilibDir); + if (fs.existsSync(ilibPath)) { + const ilibManifest = path.join(ilibPath, 'locale', 'ilibmanifest.json'); + manifests.push(ensureManifest(ilibManifest, create)); + } + + const resourcesManifest = path.join(context, options.resources || 'resources', 'ilibmanifest.json'); + manifests.push(ensureManifest(resourcesManifest, create)); + + let pkgDir = context; + for (let t = app.theme; t; t = t.theme) { + const themeDir = packageSearch(pkgDir, t.name); + if (themeDir) { + const themeManifest = path.join(context, themeDir, 'resources', 'ilibmanifest.json'); + manifests.push(ensureManifest(themeManifest, create)); + pkgDir = path.dirname(path.join(context, themeDir)); + } + } + + for (const manifest of manifests) { + if (fs.existsSync(manifest)) { + emitManifestAssets(context, output, manifest, cache); + } + } +} + +module.exports = {getIlibDefines, applyIlibResources, findIlibPath, bundleConst}; diff --git a/config/bun/plugins/babel-enact.js b/config/bun/plugins/babel-enact.js new file mode 100644 index 00000000..62d886d6 --- /dev/null +++ b/config/bun/plugins/babel-enact.js @@ -0,0 +1,44 @@ +const path = require('path'); +const babel = require('@babel/core'); + +function createBabelEnactPlugin (options = {}) { + const babelConfigPath = path.join(__dirname, '..', '..', 'babel.config.js'); + const compact = !!options.production; + const babelPlugins = []; + + if (options.fastRefresh) { + babelPlugins.push(require.resolve('react-refresh/babel')); + } + + return { + name: 'enact-babel', + setup (build) { + build.onLoad({filter: /\.(js|mjs|jsx|ts|tsx)$/}, async args => { + if (/node_modules/.test(args.path) && !/node_modules[/\\]@enact/.test(args.path)) { + return undefined; + } + + const source = await Bun.file(args.path).text(); + const result = await babel.transformAsync(source, { + filename: args.path, + configFile: babelConfigPath, + babelrc: false, + plugins: babelPlugins, + sourceMaps: options.sourcemap ? 'inline' : false, + compact + }); + + let loader = 'js'; + if (/\.tsx?$/.test(args.path)) loader = 'ts'; + if (/\.jsx$/.test(args.path)) loader = 'jsx'; + + return { + loader, + contents: result.code + }; + }); + } + }; +} + +module.exports = {createBabelEnactPlugin}; diff --git a/config/bun/plugins/case-sensitive-enact.js b/config/bun/plugins/case-sensitive-enact.js new file mode 100644 index 00000000..488dcdf4 --- /dev/null +++ b/config/bun/plugins/case-sensitive-enact.js @@ -0,0 +1,50 @@ +const fs = require('fs'); +const path = require('path'); + +function createCaseSensitiveEnactPlugin (options = {}) { + if (process.platform === 'win32' || process.platform === 'darwin') { + return null; + } + + const realpathSync = fs.realpathSync.native || fs.realpathSync; + + return { + name: 'enact-case-sensitive-paths', + setup (build) { + build.onResolve({filter: /.*/}, args => { + if (args.namespace !== 'file' && args.namespace) { + return undefined; + } + if (!args.path.startsWith('.') && !path.isAbsolute(args.path)) { + return undefined; + } + + const resolved = path.isAbsolute(args.path) + ? args.path + : path.resolve(args.resolveDir, args.path); + + if (!fs.existsSync(resolved)) { + return undefined; + } + + try { + const real = realpathSync(resolved); + if (real !== resolved) { + throw new Error( + `Cannot resolve path '${args.path}' with different casing than the real path '${real}'.` + ); + } + } catch (e) { + if (e.code === 'ENOENT') { + return undefined; + } + throw e; + } + + return undefined; + }); + } + }; +} + +module.exports = {createCaseSensitiveEnactPlugin}; diff --git a/config/bun/plugins/eslint-enact.js b/config/bun/plugins/eslint-enact.js new file mode 100644 index 00000000..c0a5ac0b --- /dev/null +++ b/config/bun/plugins/eslint-enact.js @@ -0,0 +1,65 @@ +const path = require('path'); +const {ESLint} = require('eslint'); + +let eslintInstance; + +function getESLint (context) { + if (!eslintInstance) { + const configFile = path.join(__dirname, '..', '..', 'eslintWebpackPluginConfig.js'); + eslintInstance = new ESLint({ + overrideConfigFile: configFile, + cache: true, + cacheLocation: path.join(context, 'node_modules', '.cache', '.eslintcache'), + cwd: context, + errorOnUnmatchedPattern: false + }); + } + return eslintInstance; +} + +function shouldLint (filePath) { + if (!/\.(js|mjs|jsx|ts|tsx)$/.test(filePath)) { + return false; + } + if (/node_modules[/\\]/.test(filePath) && !/node_modules[/\\]@enact[/\\]/.test(filePath)) { + return false; + } + return true; +} + +function createEslintEnactPlugin (options = {}) { + if (options.linting === false) { + return null; + } + + const formatterPath = require.resolve('react-dev-utils/eslintFormatter'); + + return { + name: 'enact-eslint', + setup (build) { + build.onLoad({filter: /\.(js|mjs|jsx|ts|tsx)$/}, async args => { + if (!shouldLint(args.path)) { + return undefined; + } + + const eslint = getESLint(options.context); + const results = await eslint.lintFiles(args.path); + const formatter = await eslint.loadFormatter(formatterPath); + const resultText = await formatter.format(results); + + if (resultText) { + console.log(resultText); + } + + const hasErrors = results.some(result => result.errorCount > 0); + if (hasErrors) { + throw new Error('Lint errors found.'); + } + + return undefined; + }); + } + }; +} + +module.exports = {createEslintEnactPlugin}; diff --git a/config/bun/plugins/externals-enact.js b/config/bun/plugins/externals-enact.js new file mode 100644 index 00000000..c19ac882 --- /dev/null +++ b/config/bun/plugins/externals-enact.js @@ -0,0 +1,155 @@ +const fs = require('fs'); +const path = require('path'); +const app = require('@enact/dev-utils/option-parser'); + +const DEFAULT_LIBRARIES = [ + '@enact', + 'react', + 'react-dom', + 'react-dom/client', + 'react-dom/server', + 'react/jsx-runtime', + 'react/jsx-dev-runtime', + 'ilib' +]; + +const DEFAULT_IGNORE = [ + '@enact/dev-utils', + '@enact/storybook-utils', + '@enact/ui-test-utils', + '@enact/screenshot-test-utils', + 'readable-stream', + 'react-is' +]; + +function escapeRegExp (value) { + return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); +} + +function findParentMain (dir) { + const currPkg = path.join(dir, 'package.json'); + if (fs.existsSync(currPkg)) { + const meta = JSON.parse(fs.readFileSync(currPkg, {encoding: 'utf8'})); + if (meta.main) { + return {path: dir, pointsTo: path.join(dir, meta.main).replace(/\.js$/, '')}; + } + } + if (dir === path.parse(dir).root || dir === '.' || dir === '') { + return null; + } + return findParentMain(path.dirname(dir)); +} + +function normalizeLocalId (resource, context) { + const parent = findParentMain(path.dirname(resource)); + let localResource = resource; + if (parent && parent.pointsTo === resource) { + localResource = parent.path; + } + return localResource + .replace(context, app.name) + .replace(/\.js$/, '') + .replace(/\\/g, '/') + .replace(app.name + '/node_modules/', '') + .replace(/[\\/]$/, ''); +} + +function shouldExternalizeLocal (resource, context, ignoreReg) { + if (!resource.startsWith(context)) return false; + if (/[\\/]tests[\\/]/.test('./' + path.relative(context, resource))) return false; + const relative = resource.replace(/^(.*[\\/]node_modules[\\/])+/, ''); + if (ignoreReg && ignoreReg.test(relative)) return false; + return true; +} + +function createExternalsEnactPlugin (options = {}) { + const libraries = options.libraries || DEFAULT_LIBRARIES; + const ignore = options.ignore || DEFAULT_IGNORE; + const polyfillPath = options.polyfill || null; + const context = options.context || app.context; + const enableLocal = !!options.local; + const libReg = new RegExp('^(' + libraries.map(escapeRegExp).join('|') + ')(?=/|$)'); + const ignReg = new RegExp('^(' + ignore.map(p => escapeRegExp(p)).join('|') + ')(?=/|$)'); + + return { + name: 'enact-externals', + setup (build) { + if (polyfillPath) { + const resolvedPolyfill = path.resolve(polyfillPath); + build.onResolve({filter: /.*/}, args => { + const resolved = path.isAbsolute(args.path) + ? args.path + : path.resolve(args.resolveDir, args.path); + if (resolved === resolvedPolyfill) { + return { + path: '@enact/polyfills', + namespace: 'enact-external' + }; + } + return undefined; + }); + } + + if (enableLocal) { + build.onResolve({filter: /^\./}, args => { + const resource = path.resolve(args.resolveDir, args.path); + if (!shouldExternalizeLocal(resource, context, ignReg)) { + return undefined; + } + return { + path: normalizeLocalId(resource, context), + namespace: 'enact-external' + }; + }); + } + + build.onResolve({filter: libReg}, args => { + if (ignReg.test(args.path)) { + return undefined; + } + return { + path: args.path, + namespace: 'enact-external' + }; + }); + + build.onLoad({filter: /.*/, namespace: 'enact-external'}, args => { + const id = args.path; + const contents = [ + `const fw = typeof enact_framework !== 'undefined' ? enact_framework : globalThis.enact_framework;`, + `const req = typeof fw === 'function' ? fw : fw && fw.require;`, + `if (!req) {`, + ` throw new Error('External Enact framework not loaded. Include enact.js before the app bundle.');`, + `}`, + `const mod = req(${JSON.stringify(id)});`, + `module.exports = mod && mod.__esModule ? mod.default : mod;`, + `if (mod && typeof mod === 'object') {`, + ` for (const key of Object.keys(mod)) {`, + ` if (key !== 'default') module.exports[key] = mod[key];`, + ` }`, + `}` + ].join('\n'); + return {loader: 'js', contents}; + }); + } + }; +} + +function shouldEnableLocalExternals (context) { + const pkgRoot = require('@enact/dev-utils/package-root'); + process.chdir(context); + const pkg = pkgRoot(); + return ( + pkg.meta.name.startsWith('@enact/') && + (fs.existsSync(path.join(pkg.path, 'MoonstoneDecorator')) || + fs.existsSync(path.join(pkg.path, 'ThemeDecorator')) || + pkg.meta.name === '@enact/i18n') + ); +} + +module.exports = { + createExternalsEnactPlugin, + shouldEnableLocalExternals, + DEFAULT_LIBRARIES, + DEFAULT_IGNORE +}; diff --git a/config/bun/plugins/index.js b/config/bun/plugins/index.js new file mode 100644 index 00000000..3ee41a48 --- /dev/null +++ b/config/bun/plugins/index.js @@ -0,0 +1,64 @@ +const {createBabelEnactPlugin} = require('./babel-enact'); +const {createLessEnactPlugin} = require('./less-enact'); +const {createResolveEnactPlugin} = require('./resolve-enact'); +const {createExternalsEnactPlugin} = require('./externals-enact'); +const {createIsomorphicEnactPlugin} = require('./isomorphic-enact'); +const {createEslintEnactPlugin} = require('./eslint-enact'); +const {createSnapshotEnactPlugin} = require('./snapshot-enact'); +const {createCaseSensitiveEnactPlugin} = require('./case-sensitive-enact'); +const {createTypescriptEnactPlugin} = require('./typescript-enact'); + +function createEnactPlugins (options = {}) { + const plugins = []; + + const eslintPlugin = createEslintEnactPlugin(options); + if (eslintPlugin) { + plugins.push(eslintPlugin); + } + + const typescriptPlugin = createTypescriptEnactPlugin(options); + if (typescriptPlugin) { + plugins.push(typescriptPlugin); + } + + const caseSensitivePlugin = createCaseSensitiveEnactPlugin(options); + if (caseSensitivePlugin) { + plugins.push(caseSensitivePlugin); + } + + if (options.snapshot) { + plugins.unshift(createSnapshotEnactPlugin(options)); + } + + plugins.push( + createResolveEnactPlugin(options), + createBabelEnactPlugin(options), + createLessEnactPlugin(options) + ); + + if (options.useExternals) { + plugins.unshift(createExternalsEnactPlugin(options.externalsOptions)); + } + + if (options.isomorphic && !options.useExternals) { + plugins.unshift(createIsomorphicEnactPlugin({ + isomorphic: true, + globalName: 'App', + useExternals: false + })); + } + + return plugins; +} + +module.exports = { + createEnactPlugins, + createBabelEnactPlugin, + createLessEnactPlugin, + createExternalsEnactPlugin, + createIsomorphicEnactPlugin, + createEslintEnactPlugin, + createSnapshotEnactPlugin, + createCaseSensitiveEnactPlugin, + createTypescriptEnactPlugin +}; diff --git a/config/bun/plugins/isomorphic-enact.js b/config/bun/plugins/isomorphic-enact.js new file mode 100644 index 00000000..bf917c88 --- /dev/null +++ b/config/bun/plugins/isomorphic-enact.js @@ -0,0 +1,74 @@ +const fs = require('fs'); + +const ISOMORPHIC_EXTERNALS = [ + 'react', + 'react-dom', + 'react-dom/client', + 'react/jsx-runtime', + 'react/jsx-dev-runtime' +]; + +function getIsomorphicExternals () { + return ISOMORPHIC_EXTERNALS; +} + +function wrapIsomorphicBundle (code, globalName = 'App') { + const body = code.replace(/^\uFEFF?#![^\n]*\n/, ''); + return [ + `(function (root, factory) {`, + `\tif (typeof module === 'object' && typeof module.exports !== 'undefined') {`, + `\t\tmodule.exports = factory(root, typeof require === 'function' ? require : null);`, + `\t} else {`, + `\t\troot.${globalName} = factory(root, null);`, + `\t}`, + `})(typeof self !== 'undefined' ? self : this, function (root, nodeRequire) {`, + `\tvar exports = {};`, + `\tvar module = { exports: exports };`, + `\tvar require = nodeRequire || function (name) {`, + `\t\tif (name === 'react') return root.React || globalThis.React;`, + `\t\tif (name === 'react/jsx-runtime' || name === 'react/jsx-dev-runtime') {`, + `\t\t\tvar React = root.React || globalThis.React;`, + `\t\t\treturn { jsx: React.createElement, jsxs: React.createElement, Fragment: React.Fragment };`, + `\t\t}`, + `\t\tif (name === 'react-dom/client') return root.ReactDOMClient || globalThis.ReactDOMClient;`, + `\t\tif (name === 'react-dom') return root.ReactDOM || globalThis.ReactDOM;`, + `\t\tthrow new Error('Cannot find module ' + name);`, + `\t};`, + `\t(function () {`, + body, + `\t})();`, + `\treturn module.exports && module.exports.default !== undefined ? module.exports.default : module.exports;`, + `});`, + '' + ].join('\n'); +} + +function createIsomorphicEnactPlugin (options = {}) { + const reactPackages = getIsomorphicExternals(); + + return { + name: 'enact-isomorphic', + setup (build) { + if (!options.useExternals) { + build.onResolve({filter: /^react(-dom)?(\/.*)?$/}, args => { + if (reactPackages.includes(args.path)) { + return {path: args.path, external: true}; + } + return undefined; + }); + } + + build.onEnd (result => { + if (!options.isomorphic || !result.success) return; + + for (const output of result.outputs) { + if (!output.path.endsWith('.js')) continue; + const code = fs.readFileSync(output.path, {encoding: 'utf8'}); + fs.writeFileSync(output.path, wrapIsomorphicBundle(code, options.globalName || 'App'), {encoding: 'utf8'}); + } + }); + } + }; +} + +module.exports = {createIsomorphicEnactPlugin, wrapIsomorphicBundle, getIsomorphicExternals}; diff --git a/config/bun/plugins/less-enact.js b/config/bun/plugins/less-enact.js new file mode 100644 index 00000000..a6198752 --- /dev/null +++ b/config/bun/plugins/less-enact.js @@ -0,0 +1,93 @@ +const path = require('path'); +const less = require('less'); +const sass = require('sass'); +const postcss = require('postcss'); +const {createPostcssEnactPlugin} = require('./postcss-enact'); + +function isModuleStylesheet (filePath, forceCSSModules) { + return forceCSSModules || /\.module\.(css|less|scss|sass)$/.test(filePath); +} + +async function compileSass (source, filePath) { + const result = sass.compileString(source, { + url: new URL(`file:///${filePath.replace(/\\/g, '/')}`), + loadPaths: [path.dirname(filePath)], + style: 'expanded' + }); + return result.css; +} + +function createLessEnactPlugin (options = {}) { + const postcssPlugin = createPostcssEnactPlugin(options); + + return { + name: 'enact-less', + setup (build) { + build.onLoad({filter: /\.(scss|sass)$/}, async args => { + const source = await Bun.file(args.path).text(); + const css = await compileSass(source, args.path); + const processed = await postcssPlugin.processCss(css, args.path); + const moduleMode = isModuleStylesheet(args.path, options.forceCSSModules); + + if (moduleMode) { + return { + loader: 'css', + contents: processed.css, + exports: processed.exports + }; + } + + return { + loader: 'css', + contents: processed.css + }; + }); + + build.onLoad({filter: /\.less$/}, async args => { + const source = await Bun.file(args.path).text(); + const lessResult = await less.render(source, { + filename: args.path, + paths: [path.dirname(args.path)], + modifyVars: Object.assign({__DEV__: !options.production}, options.accent || {}), + javascriptEnabled: true + }); + + const processed = await postcssPlugin.processCss(lessResult.css, args.path); + const moduleMode = isModuleStylesheet(args.path, options.forceCSSModules); + + if (moduleMode) { + return { + loader: 'css', + contents: processed.css, + exports: processed.exports + }; + } + + return { + loader: 'css', + contents: processed.css + }; + }); + + build.onLoad({filter: /\.css$/}, async args => { + if (/\.module\.css$/.test(args.path) || options.forceCSSModules) { + const source = await Bun.file(args.path).text(); + const processed = await postcssPlugin.processCss(source, args.path, true); + return { + loader: 'css', + contents: processed.css, + exports: processed.exports + }; + } + const source = await Bun.file(args.path).text(); + const processed = await postcssPlugin.processCss(source, args.path); + return { + loader: 'css', + contents: processed.css + }; + }); + } + }; +} + +module.exports = {createLessEnactPlugin, isModuleStylesheet}; diff --git a/config/bun/plugins/postcss-enact.js b/config/bun/plugins/postcss-enact.js new file mode 100644 index 00000000..fab82b72 --- /dev/null +++ b/config/bun/plugins/postcss-enact.js @@ -0,0 +1,83 @@ +const fs = require('fs'); +const path = require('path'); +const postcss = require('postcss'); +const postcssImportJson = require('@daltontan/postcss-import-json'); +const postcssModules = require('postcss-modules'); +const {cssModuleIdent: getLocalIdent} = require('@enact/dev-utils'); + +function createPostcssImportJsonTildePlugin () { + return { + postcssPlugin: 'postcss-import-json-tilde', + Once (root) { + root.walkAtRules('import-json', atRule => { + let src = atRule.params.slice(1, -1); + if (!src.startsWith('~')) return; + + const packagePath = src.substring(1); + const currentFileDir = path.dirname(atRule.source.input.file || process.cwd()); + let resolvedPath; + try { + resolvedPath = require.resolve(packagePath, {paths: [currentFileDir]}); + } catch (e) { + resolvedPath = require.resolve(packagePath, {paths: [process.cwd()]}); + } + atRule.params = `"${path.relative(currentFileDir, resolvedPath)}"`; + }); + } + }; +} +createPostcssImportJsonTildePlugin.postcss = true; + +function buildPostcssPlugins (options = {}) { + return [ + options.useTailwind && require('tailwindcss'), + require('postcss-flexbugs-fixes'), + require('postcss-preset-env')({ + autoprefixer: {flexbox: 'no-2009', remove: false}, + stage: 3, + features: {'custom-properties': false} + }), + !options.useTailwind && require('postcss-normalize'), + options.ri !== false && require('postcss-resolution-independence')(options.ri), + createPostcssImportJsonTildePlugin(), + postcssImportJson({ + map: (selector, value) => { + if (typeof value === 'object' && value !== null && value.$ref) { + const tokenPath = value.$ref.split('#/')[1]; + return `var(--${tokenPath.replace(/\//g, '-')})`; + } + return value; + } + }) + ].filter(Boolean); +} + +function createPostcssEnactPlugin (options = {}) { + return { + async processCss (source, filePath, asModule) { + let exports = {}; + const plugins = [...buildPostcssPlugins(options)]; + + if (asModule) { + plugins.unshift( + postcssModules({ + generateScopedName: (name, filename) => + getLocalIdent( + {resourcePath: filename || filePath, rootContext: options.context}, + '[name]_[local]', + name + ), + getJSON: (_cssFileName, moduleExports) => { + exports = moduleExports; + } + }) + ); + } + + const result = await postcss(plugins).process(source, {from: filePath}); + return {css: result.css, exports: asModule ? exports : undefined}; + } + }; +} + +module.exports = {createPostcssEnactPlugin, buildPostcssPlugins}; diff --git a/config/bun/plugins/resolve-enact.js b/config/bun/plugins/resolve-enact.js new file mode 100644 index 00000000..e63f0762 --- /dev/null +++ b/config/bun/plugins/resolve-enact.js @@ -0,0 +1,57 @@ +const path = require('path'); +const fs = require('fs'); + +function normalizeBundlerPath (filePath) { + return filePath.replace(/\\/g, '/'); +} + +function createResolveEnactPlugin (options = {}) { + const context = options.context || process.cwd(); + const aliases = options.aliases || {}; + + return { + name: 'enact-resolve', + setup (build) { + build.onResolve({filter: /.*/}, args => { + for (const [key, target] of Object.entries(aliases)) { + if (args.path === key) { + let resolved = target; + if (!path.isAbsolute(target) && !target.startsWith('@')) { + resolved = path.join(context, target); + } else { + try { + resolved = require.resolve(target, {paths: [context, args.importer].filter(Boolean)}); + } catch (e) { + return undefined; + } + } + return {path: normalizeBundlerPath(resolved)}; + } + } + + if (args.path === 'ilib' || args.path === '@enact/i18n/ilib') { + const checks = ['@enact/i18n/ilib', 'ilib']; + for (const check of checks) { + try { + return { + path: normalizeBundlerPath(require.resolve(check, {paths: [context, args.importer].filter(Boolean)})) + }; + } catch (e) { + // continue + } + } + } + + return undefined; + }); + + build.onLoad({filter: /node_modules[/\\]ilib[/\\]index\.js$/}, async args => { + let source = await Bun.file(args.path).text(); + source = source.replace(/require\("\.\/lib\/ilib-[^"]+"\)/g, 'undefined'); + return {loader: 'js', contents: source}; + }); + } + }; +} + +module.exports = {createResolveEnactPlugin, normalizeBundlerPath}; diff --git a/config/bun/plugins/snapshot-enact.js b/config/bun/plugins/snapshot-enact.js new file mode 100644 index 00000000..fc6de4cc --- /dev/null +++ b/config/bun/plugins/snapshot-enact.js @@ -0,0 +1,96 @@ +const fs = require('fs'); +const path = require('path'); +const {resolveDevUtilsModule} = require('../resolve-dev-utils'); + +function resolveSnapshotHelper (name) { + const candidates = [ + path.join(__dirname, '..', '..', '..', '..', 'dev-utils', 'plugins', 'SnapshotPlugin', `${name}.js`), + path.join(__dirname, '..', '..', '..', 'dev-utils', 'plugins', 'SnapshotPlugin', `${name}.js`) + ]; + + for (const candidate of candidates) { + if (fs.existsSync(candidate)) { + return candidate; + } + } + + try { + return require.resolve(`@enact/dev-utils/plugins/SnapshotPlugin/${name}`); + } catch (e) { + resolveDevUtilsModule(`plugins/SnapshotPlugin/${name}`); + throw new Error(`Unable to resolve SnapshotPlugin helper: ${name}`); + } +} + +function packageMissing (context, lib) { + return !fs.existsSync(path.join(context, 'node_modules', lib)); +} + +function createSnapshotEnactPlugin (options = {}) { + const context = options.context; + const helperJS = resolveSnapshotHelper('snapshot-helper'); + const helperReduxJS = resolveSnapshotHelper('snapshot-redux-helper'); + const reactDOMClient = path.join(context, 'node_modules', 'react-dom', 'client'); + const reduxPath = path.join(context, 'node_modules', 'react-redux'); + const reactRedux = fs.existsSync(reduxPath) ? reduxPath : null; + const optionalMissing = [ + '@enact/i18n', + '@enact/moonstone', + '@enact/sandstone', + '@enact/limestone', + '@enact/core/snapshot' + ].filter(lib => packageMissing(context, lib)); + + const ignoreIlib = ['ilib', '@enact/i18n/ilib'].every(lib => packageMissing(context, lib)); + + return { + name: 'enact-snapshot', + setup (build) { + build.onLoad({filter: /.*/, namespace: 'snapshot-empty'}, () => ({ + contents: 'module.exports = {};', + loader: 'js' + })); + + build.onResolve({filter: /.*/}, args => { + if (args.kind !== 'import-statement' && args.kind !== 'require-call') { + return undefined; + } + + const issuer = args.importer || ''; + const fromHelper = issuer === helperJS || issuer === helperReduxJS; + + if (args.path === 'react-dom/client') { + if (fromHelper) { + return {path: reactDOMClient}; + } + return {path: helperJS}; + } + + if (reactRedux && args.path === 'react-redux') { + if (fromHelper) { + return {path: reactRedux}; + } + return {path: helperReduxJS}; + } + + for (const lib of optionalMissing) { + if (args.path === lib || args.path.startsWith(`${lib}/`)) { + if (issuer.startsWith(path.dirname(helperJS))) { + return {path: args.path, namespace: 'snapshot-empty'}; + } + } + } + + if (ignoreIlib && (args.path === 'ilib' || args.path.startsWith('ilib/'))) { + if (issuer.startsWith(path.dirname(helperJS))) { + return {path: args.path, namespace: 'snapshot-empty'}; + } + } + + return undefined; + }); + } + }; +} + +module.exports = {createSnapshotEnactPlugin, resolveSnapshotHelper}; diff --git a/config/bun/plugins/typescript-enact.js b/config/bun/plugins/typescript-enact.js new file mode 100644 index 00000000..e0f2b48d --- /dev/null +++ b/config/bun/plugins/typescript-enact.js @@ -0,0 +1,77 @@ +const fs = require('fs'); +const path = require('path'); + +let typecheckRunning = false; + +function formatDiagnostics (diagnostics, host) { + return diagnostics + .map(diagnostic => { + const message = host.getCategoryFormat(diagnostic.category)(diagnostic.messageText); + if (diagnostic.file && typeof diagnostic.start === 'number') { + const {line, character} = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start); + return `${diagnostic.file.fileName}(${line + 1},${character + 1}): ${message}`; + } + return message; + }) + .join('\n'); +} + +function runTypeCheck (context) { + const configPath = path.join(context, 'tsconfig.json'); + if (!fs.existsSync(configPath) || typecheckRunning) { + return Promise.resolve(); + } + + let ts; + try { + ts = require(require.resolve('typescript', {paths: [context, __dirname]})); + } catch (e) { + return Promise.resolve(); + } + + typecheckRunning = true; + return Promise.resolve().then(() => { + const configFile = ts.readConfigFile(configPath, ts.sys.readFile); + if (configFile.error) { + throw new Error(ts.formatDiagnostic(configFile.error, { + getCategoryFormat: () => msg => msg + })); + } + + const parsed = ts.parseJsonConfigFileContent(configFile.config, ts.sys, context); + const program = ts.createProgram(parsed.fileNames, parsed.options); + const diagnostics = ts.getPreEmitDiagnostics(program); + const errors = diagnostics.filter(d => d.category === ts.DiagnosticCategory.Error); + + if (errors.length > 0) { + const host = { + getCategoryFormat: category => { + if (category === ts.DiagnosticCategory.Error) return msg => `error TS: ${msg}`; + return msg => msg; + } + }; + throw new Error(formatDiagnostics(errors, host)); + } + }).finally(() => { + typecheckRunning = false; + }); +} + +function createTypescriptEnactPlugin (options = {}) { + if (options.typeCheck === false) { + return null; + } + + const context = options.context; + + return { + name: 'enact-typescript', + setup (build) { + build.onStart(async () => { + await runTypeCheck(context); + }); + } + }; +} + +module.exports = {createTypescriptEnactPlugin, runTypeCheck}; diff --git a/config/bun/post-build.js b/config/bun/post-build.js new file mode 100644 index 00000000..4e666547 --- /dev/null +++ b/config/bun/post-build.js @@ -0,0 +1,41 @@ +const fs = require('fs-extra'); +const path = require('path'); +const {applyWebOSMeta} = require('./webos-meta'); +const {applyIlibResources} = require('./ilib-meta'); + +function copyDir (from, to) { + if (fs.existsSync(from)) { + fs.copySync(from, to, {dereference: true}); + } +} + +function copyPublicFolder (context, output) { + const publicDir = path.join(context, 'public'); + if (fs.existsSync(publicDir)) { + fs.copySync(publicDir, output, {dereference: true}); + } +} + +function ensureCustomizationsDir (output) { + fs.ensureDirSync(path.join(output, 'customizations')); +} + +function applyPostBuild (context, output, options = {}) { + copyPublicFolder(context, output); + applyIlibResources(context, output, { + ilibAdditionalResourcesPath: options.ilibAdditionalResourcesPath, + create: true, + cache: !options.watch + }); + applyWebOSMeta(context, output, { + v8SnapshotFile: options.v8SnapshotFile + }); + if (options.customSkin) { + ensureCustomizationsDir(output); + } + if (options.ilibAdditionalResourcesPath && fs.existsSync(options.ilibAdditionalResourcesPath)) { + copyDir(options.ilibAdditionalResourcesPath, path.join(output, 'resources')); + } +} + +module.exports = {applyPostBuild, copyPublicFolder}; diff --git a/config/bun/prerender.js b/config/bun/prerender.js new file mode 100644 index 00000000..8c41c0f8 --- /dev/null +++ b/config/bun/prerender.js @@ -0,0 +1,36 @@ +const {resolveDevUtilsModule} = require('./resolve-dev-utils'); + +function resolveApplyBunPostBuild () { + try { + const PrerenderPlugin = require('@enact/dev-utils/plugins/PrerenderPlugin'); + if (typeof PrerenderPlugin.applyBunPostBuild === 'function') { + return PrerenderPlugin.applyBunPostBuild; + } + } catch (e) { + // continue + } + + const prerender = resolveDevUtilsModule('bun-plugins/prerender'); + if (prerender && typeof prerender.applyPrerender === 'function') { + return prerender.applyPrerender; + } + + const localPlugin = resolveDevUtilsModule('plugins/PrerenderPlugin'); + if (localPlugin && typeof localPlugin.applyBunPostBuild === 'function') { + return localPlugin.applyBunPostBuild; + } + + return null; +} + +function applyPrerender (options = {}) { + const applyBunPostBuild = resolveApplyBunPostBuild(); + if (!applyBunPostBuild) { + throw new Error( + 'Prerender is unavailable. Install @enact/dev-utils with Bun support or use a linked dev-utils workspace.' + ); + } + return applyBunPostBuild(options); +} + +module.exports = {applyPrerender, resolveApplyBunPostBuild}; diff --git a/config/bun/react-globals-entry.js b/config/bun/react-globals-entry.js new file mode 100644 index 00000000..ee7e9c4b --- /dev/null +++ b/config/bun/react-globals-entry.js @@ -0,0 +1,9 @@ +import React from 'react'; +import * as ReactDOMClient from 'react-dom/client'; + +if (typeof globalThis !== 'undefined') { + globalThis.React = React; + globalThis.ReactDOMClient = ReactDOMClient; +} + +export default React; diff --git a/config/bun/resolve-bun.js b/config/bun/resolve-bun.js new file mode 100644 index 00000000..d34ae4c7 --- /dev/null +++ b/config/bun/resolve-bun.js @@ -0,0 +1,84 @@ +const {spawnSync} = require('child_process'); +const fs = require('fs'); +const path = require('path'); + +function firstExisting (paths) { + for (const candidate of paths) { + if (candidate && fs.existsSync(candidate)) { + return candidate; + } + } + return null; +} + +function resolveBundledBun () { + const cliRoot = path.join(__dirname, '..', '..'); + const bunRoot = path.join(cliRoot, 'node_modules', 'bun'); + + return firstExisting([ + path.join(bunRoot, 'bin', 'bun'), + // npm postinstall always links the native binary to bun.exe (all platforms) + path.join(bunRoot, 'bin', 'bun.exe'), + path.join(cliRoot, 'node_modules', '.bin', 'bun') + ]); +} + +function resolveOvenBun () { + const {platform, arch} = process; + const names = []; + + if (platform === 'linux') { + names.push( + `@oven/bun-linux-${arch}`, + `@oven/bun-linux-${arch}-baseline`, + `@oven/bun-linux-${arch}-musl`, + `@oven/bun-linux-${arch}-musl-baseline` + ); + } else if (platform === 'darwin') { + names.push( + `@oven/bun-darwin-${arch}`, + `@oven/bun-darwin-${arch}-baseline` + ); + } else if (platform === 'win32') { + names.push( + `@oven/bun-windows-${arch}`, + `@oven/bun-windows-${arch}-baseline` + ); + } + + for (const name of names) { + for (const exe of ['bin/bun', 'bin/bun.exe']) { + try { + const resolved = require.resolve(`${name}/${exe}`); + if (fs.existsSync(resolved)) { + return resolved; + } + } catch (err) { + // optional platform package not installed + } + } + } + + return null; +} + +function resolveBun () { + const bundled = resolveBundledBun(); + if (bundled) return bundled; + + const oven = resolveOvenBun(); + if (oven) return oven; + + const which = spawnSync(process.platform === 'win32' ? 'where' : 'which', ['bun'], { + encoding: 'utf8' + }); + if (which.status === 0 && which.stdout.trim()) { + return which.stdout.trim().split(/\r?\n/)[0]; + } + + throw new Error( + 'Bun is required but was not found. Install Bun 1.3+ from https://bun.com and ensure it is on your PATH.' + ); +} + +module.exports = {resolveBun}; diff --git a/config/bun/resolve-dev-utils.js b/config/bun/resolve-dev-utils.js new file mode 100644 index 00000000..541b0942 --- /dev/null +++ b/config/bun/resolve-dev-utils.js @@ -0,0 +1,50 @@ +const fs = require('fs'); +const path = require('path'); + +function getWorkspaceDevUtilsRoots () { + return [ + path.join(__dirname, '..', '..', '..', 'dev-utils'), + path.join(__dirname, '..', '..', '..', '..', 'dev-utils') + ]; +} + +function resolveModulePath (basePath) { + if (fs.existsSync(`${basePath}.js`)) { + return basePath; + } + if (fs.existsSync(path.join(basePath, 'index.js'))) { + return path.join(basePath, 'index.js'); + } + return null; +} + +function resolveDevUtilsModule (subpath) { + try { + return require(`@enact/dev-utils/${subpath}`); + } catch (e) { + // continue + } + + try { + const pkgRoot = path.dirname(require.resolve('@enact/dev-utils/package.json')); + const localPath = path.join(pkgRoot, subpath.replace(/\//g, path.sep)); + const resolved = resolveModulePath(localPath); + if (resolved) { + return require(resolved); + } + } catch (e) { + // continue + } + + for (const root of getWorkspaceDevUtilsRoots()) { + const localPath = path.join(root, subpath.replace(/\//g, path.sep)); + const resolved = resolveModulePath(localPath); + if (resolved) { + return require(resolved); + } + } + + return null; +} + +module.exports = {resolveDevUtilsModule, getWorkspaceDevUtilsRoots}; diff --git a/config/bun/snapshot.js b/config/bun/snapshot.js new file mode 100644 index 00000000..df4b376b --- /dev/null +++ b/config/bun/snapshot.js @@ -0,0 +1,85 @@ +const cp = require('child_process'); +const fs = require('fs'); +const path = require('path'); +const glob = require('glob'); + +function getBlobName (args) { + for (let i = 0; i < args.length; i++) { + if (args[i].indexOf('--startup-blob=') === 0) { + return args[i].replace('--startup-blob=', ''); + } + } + return 'snapshot_blob.bin'; +} + +function getSnapshotArgs (target) { + let args = [ + '--profile-deserialization', + '--random-seed=314159265', + '--abort_on_uncaught_exception', + '--startup-blob=snapshot_blob.bin' + ]; + + if (process.env.V8_SNAPSHOT_ARGS) { + args = process.env.V8_SNAPSHOT_ARGS.split(/\s+/); + } + + args.push(target); + return args; +} + +function updateAppinfoV8Snapshot (output, blobPath) { + const normalizedBlob = blobPath.replace(/\\/g, '/'); + const appinfoFiles = glob.sync('**/appinfo.json', { + cwd: output, + absolute: true, + nodir: true + }); + + for (const appinfoPath of appinfoFiles) { + const meta = JSON.parse(fs.readFileSync(appinfoPath, {encoding: 'utf8'})); + meta.v8SnapshotFile = normalizedBlob; + fs.writeFileSync(appinfoPath, JSON.stringify(meta, null, '\t') + '\n', {encoding: 'utf8'}); + } +} + +function applySnapshot (options = {}) { + const exec = options.exec || process.env.V8_MKSNAPSHOT; + const target = options.target || 'main.js'; + const output = path.resolve(options.output); + const args = getSnapshotArgs(target); + const blob = getBlobName(args); + + if (!exec) { + return null; + } + + const child = cp.spawnSync(exec, args, {cwd: output, encoding: 'utf8'}); + if (child.status !== 0) { + const message = child.stderr || child.stdout || 'V8 snapshot generation failed.'; + import('chalk').then(({default: chalk}) => { + console.log( + chalk.red( + 'Snapshot blob generation "' + exec + ' ' + args.join(' ') + '" in "' + output + '" directory failed:' + ) + ); + }); + throw new Error(message); + } + + const blobPath = path.join(output, blob); + if (!fs.existsSync(blobPath)) { + throw new Error('V8 snapshot blob was not generated at ' + blob); + } + + const stat = fs.statSync(blobPath); + if (stat.size === 0) { + throw new Error((child.stdout || '') + '\n' + (child.stderr || '')); + } + + const snapshotMetaPath = options.v8SnapshotFile || blob; + updateAppinfoV8Snapshot(output, snapshotMetaPath); + return blobPath; +} + +module.exports = {applySnapshot, updateAppinfoV8Snapshot, getSnapshotArgs}; diff --git a/config/bun/spawn.js b/config/bun/spawn.js new file mode 100644 index 00000000..5e84b628 --- /dev/null +++ b/config/bun/spawn.js @@ -0,0 +1,27 @@ +const path = require('path'); +const spawn = require('cross-spawn'); +const {resolveBun} = require('./resolve-bun'); + +function spawnBunScript (script, args = [], opts = {}) { + const bun = resolveBun(); + const scriptPath = path.join(__dirname, script); + const spawnOpts = { + stdio: 'inherit', + cwd: opts.cwd || process.cwd(), + env: {...process.env, ...opts.env} + }; + + return new Promise((resolve, reject) => { + const child = spawn(bun, [scriptPath, ...args], spawnOpts); + child.on('close', code => { + if (code !== 0) { + reject(new Error(`Bun exited with code ${code}`)); + } else { + resolve(); + } + }); + child.on('error', reject); + }); +} + +module.exports = {spawnBunScript, resolveBun}; diff --git a/config/bun/webos-meta.js b/config/bun/webos-meta.js new file mode 100644 index 00000000..eeeb30a7 --- /dev/null +++ b/config/bun/webos-meta.js @@ -0,0 +1,134 @@ +const fs = require('fs-extra'); +const path = require('path'); +const glob = require('glob'); + +const PROPS = [ + 'icon', + 'largeIcon', + 'extraLargeIcon', + 'miniicon', + 'smallicon', + 'splashicon', + 'splashBackground', + 'bgImage', + 'imageForRecents' +]; + +let sysAssetsPath = 'sys-assets'; +let variableSysPaths = null; +const assetPathCache = {}; + +function readAppInfo (file) { + if (!fs.existsSync(file)) return null; + try { + return JSON.parse(fs.readFileSync(file, {encoding: 'utf8'})); + } catch (e) { + console.log('ERROR: unable to read/parse appinfo.json at ' + file); + return null; + } +} + +function handleSysAssetPath (context, appinfo) { + if (appinfo.sysAssetsBasePath && appinfo.sysAssetsBasePath !== sysAssetsPath) { + sysAssetsPath = appinfo.sysAssetsBasePath; + variableSysPaths = null; + } + const sys = path.join(context, sysAssetsPath); + if (!variableSysPaths && fs.existsSync(sys)) { + variableSysPaths = fs.readdirSync(sys) + .map(name => path.join(context, sysAssetsPath, name)) + .filter(entry => fs.statSync(entry).isDirectory()); + } +} + +function detectSysAssets (name) { + const result = []; + const trueName = name.substring(1); + for (const dir of variableSysPaths || []) { + const abs = path.resolve(path.join(dir, trueName)); + if (fs.existsSync(abs)) { + result.push(abs); + } + } + return result; +} + +function rootAppInfo (context, specific) { + const rootDir = [context, path.join(context, 'webos-meta')]; + if (specific) { + rootDir.unshift(path.isAbsolute(specific) ? specific : path.join(context, specific)); + } + for (const root of rootDir) { + const meta = readAppInfo(path.join(root, 'appinfo.json')); + if (meta) { + return {path: root, obj: meta}; + } + } + return null; +} + +function copyMetaAsset (abs, outPath, output) { + const dest = path.join(output, outPath); + fs.ensureDirSync(path.dirname(dest)); + if (!fs.existsSync(dest)) { + fs.copySync(abs, dest, {dereference: true}); + } +} + +function addMetaAssets (metaDir, outDirPrefix, appinfo, output) { + for (const prop of PROPS) { + if (!appinfo[prop]) continue; + const assets = appinfo[prop].charAt(0) === '$' + ? detectSysAssets(appinfo[prop]) + : [path.resolve(path.join(metaDir, appinfo[prop]))]; + + for (const abs of assets) { + if (appinfo[prop].charAt(0) === '$') { + if (!assetPathCache[abs]) { + assetPathCache[abs] = path.relative(metaDir, abs).replace(/\\/g, '/'); + } + } else if (assetPathCache[abs]) { + appinfo[prop] = path.relative(outDirPrefix || output, assetPathCache[abs]).replace(/\\/g, '/'); + } else { + assetPathCache[abs] = path.join(outDirPrefix || '', appinfo[prop]).replace(/\\/g, '/'); + } + + if (fs.existsSync(abs)) { + copyMetaAsset(abs, assetPathCache[abs], output); + } + } + } +} + +function applyWebOSMeta (context, output, options = {}) { + sysAssetsPath = 'sys-assets'; + variableSysPaths = null; + Object.keys(assetPathCache).forEach(key => delete assetPathCache[key]); + + const meta = rootAppInfo(context, options.path); + if (meta && meta.obj) { + let appinfo = {...meta.obj}; + if (options.v8SnapshotFile) { + appinfo.v8SnapshotFile = options.v8SnapshotFile; + } + handleSysAssetPath(context, appinfo); + addMetaAssets(meta.path, '', appinfo, output); + fs.writeFileSync(path.join(output, 'appinfo.json'), JSON.stringify(appinfo, null, '\t') + '\n', {encoding: 'utf8'}); + } + + const localized = glob.sync('resources/**/appinfo.json', {cwd: context, absolute: true}); + for (const locFile of localized) { + const locRel = path.relative(context, locFile).replace(/\\/g, '/'); + const locMeta = readAppInfo(locFile); + if (!locMeta) continue; + + handleSysAssetPath(context, locMeta); + addMetaAssets(path.dirname(locFile), path.dirname(locRel), locMeta, output); + fs.ensureDirSync(path.join(output, path.dirname(locRel))); + fs.writeFileSync(path.join(output, locRel), JSON.stringify(locMeta, null, '\t') + '\n', {encoding: 'utf8'}); + } + + return meta && meta.obj && meta.obj.title; +} + +module.exports = {applyWebOSMeta, rootAppInfo, readAppInfo}; diff --git a/config/createEnvironmentHash.js b/config/createEnvironmentHash.js deleted file mode 100644 index d117a2cb..00000000 --- a/config/createEnvironmentHash.js +++ /dev/null @@ -1,9 +0,0 @@ -'use strict'; -const {createHash} = require('crypto'); - -module.exports = env => { - const hash = createHash('md5'); - hash.update(JSON.stringify(env)); - - return hash.digest('hex'); -}; diff --git a/config/webpack.config.js b/config/webpack.config.js deleted file mode 100644 index 54be65f8..00000000 --- a/config/webpack.config.js +++ /dev/null @@ -1,685 +0,0 @@ -/* eslint no-console: off, no-undef: off */ -/* eslint-env node, es6 */ -// @remove-on-eject-begin -/** - * Portions of this source code file are from create-react-app, used under the - * following MIT license: - * - * Copyright (c) 2013-present, Facebook, Inc. - * https://github.com/facebook/create-react-app - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ -// @remove-on-eject-end - -const fs = require('fs'); -const path = require('path'); -const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin'); -const ESLintPlugin = require('eslint-webpack-plugin'); -const ForkTsCheckerWebpackPlugin = - process.env.TSC_COMPILE_ON_ERROR === 'true' ? - require('react-dev-utils/ForkTsCheckerWarningWebpackPlugin') : - require('react-dev-utils/ForkTsCheckerWebpackPlugin'); -const HtmlWebpackPlugin = require('html-webpack-plugin'); -const MiniCssExtractPlugin = require('mini-css-extract-plugin'); -const CssMinimizerPlugin = require('css-minimizer-webpack-plugin'); -const getPublicUrlOrPath = require('react-dev-utils/getPublicUrlOrPath'); -const ModuleNotFoundPlugin = require('react-dev-utils/ModuleNotFoundPlugin'); -const NodePolyfillPlugin = require('node-polyfill-webpack-plugin'); -const resolve = require('resolve'); -const TerserPlugin = require('terser-webpack-plugin'); -const {DefinePlugin, EnvironmentPlugin} = require('webpack'); -const { - optionParser: app, - cssModuleIdent: getLocalIdent, - GracefulFsPlugin, - ILibPlugin, - WebOSMetaPlugin -} = require('@enact/dev-utils'); -const createEnvironmentHash = require('./createEnvironmentHash'); - -// This is the production and development configuration. -// It is focused on developer experience, fast rebuilds, and a minimal bundle. -module.exports = function ( - env, - noLinting = false, - contentHash = false, - isomorphic = false, - noAnimation = false, - noSplitCSS = false, - ilibAdditionalResourcesPath -) { - process.chdir(app.context); - - // Load applicable .env files into environment variables. - require('./dotenv').load(app.context); - - // Sets the browserslist default fallback set of browsers to the Enact default browser support list. - app.setEnactTargetsAsDefault(); - - // Check if TypeScript is setup - const useTypeScript = fs.existsSync('tsconfig.json'); - - // Check if Tailwind config exists - const useTailwind = fs.existsSync(path.join(app.context, 'tailwind.config.js')); - - process.env.NODE_ENV = env || process.env.NODE_ENV; - const isEnvProduction = process.env.NODE_ENV === 'production'; - - const publicPath = getPublicUrlOrPath(!isEnvProduction, app.publicUrl, process.env.PUBLIC_URL).replace(/^\/$/, ''); - - // Source maps are resource heavy and can cause out of memory issue for large source files. - // By default, sourcemaps will be used in development, however it can universally forced - // on or off by setting the GENERATE_SOURCEMAP environment variable. - const GENERATE_SOURCEMAP = process.env.GENERATE_SOURCEMAP || (isEnvProduction ? 'false' : 'true'); - const shouldUseSourceMap = GENERATE_SOURCEMAP !== 'false'; - - // common function to get style loaders - const getStyleLoaders = (cssLoaderOptions = {}, preProcessor) => { - // Multiple styling-support features are used together, bottom-to-top. - // An optonal preprocessor, like "less loader", compiles LESS syntax into CSS. - // "postcss" loader applies autoprefixer to our CSS. - // "css" loader resolves paths in CSS and adds assets as dependencies. - // `MiniCssExtractPlugin` takes the resulting CSS and puts it into an - // external file in our build process. If you use code splitting, any async - // bundles will stilluse the "style" loader inside the async code so CSS - // from them won't be in the main CSS file. - // When INLINE_STYLES env var is set, instead of MiniCssExtractPlugin, uses - // `style` loader to dynamically inline CSS in style tags at runtime. - const mergedCssLoaderOptions = { - ...cssLoaderOptions, - modules: { - ...cssLoaderOptions.modules, - // Options to restore 6.x behavior: - // https://github.com/webpack-contrib/css-loader/blob/master/CHANGELOG.md#700-2024-04-04 - namedExport: false, - exportLocalsConvention: 'as-is' - } - }; - - const loaders = [ - process.env.INLINE_STYLES ? require.resolve('style-loader') : MiniCssExtractPlugin.loader, - { - loader: require.resolve('css-loader'), - options: Object.assign({sourceMap: shouldUseSourceMap}, mergedCssLoaderOptions, { - url: { - filter: url => { - // Don't handle absolute path urls - if (url.startsWith('/')) { - return false; - } - - return true; - } - } - }) - }, - { - // Options for PostCSS as we reference these options twice - // Adds vendor prefixing based on your specified browser support in - // package.json - loader: require.resolve('postcss-loader'), - options: { - postcssOptions: { - // Necessary for external CSS imports to work - // https://github.com/facebook/create-react-app/issues/2677 - ident: 'postcss', - plugins: [ - useTailwind && 'tailwindcss', - // Fix and adjust for known flexbox issues - // See https://github.com/philipwalton/flexbugs - 'postcss-flexbugs-fixes', - // Transpile stage-3 CSS standards based on browserslist targets. - // See https://preset-env.cssdb.org/features for supported features. - // Includes support for targetted auto-prefixing. - [ - 'postcss-preset-env', - { - autoprefixer: { - flexbox: 'no-2009', - remove: false - }, - stage: 3, - features: {'custom-properties': false} - } - ], - // Adds PostCSS Normalize to standardize browser quirks based on - // the browserslist targets. - !useTailwind && require('postcss-normalize'), - // Resolution indepedence support - app.ri !== false && require('postcss-resolution-independence')(app.ri), - // Support importing JSON files with ~ alias - custom plugin (must run first) - { - postcssPlugin: 'postcss-import-json-tilde', - Once (root) { - // Process all @import-json rules with ~ prefix first, before other plugins - root.walkAtRules('import-json', atRule => { - let src = atRule.params.slice(1, -1); // Remove quotes - - // Only handle ~ alias paths - if (src.startsWith('~')) { - const packagePath = src.substring(1); // Remove ~ - - try { - // Use Node.js standard module resolution - // This mimics webpack's ~ alias behavior - const currentFileDir = path.dirname(atRule.source.input.file || ''); - - // Try to resolve the module using require.resolve - // This follows standard Node.js module resolution algorithm - let resolvedPath; - try { - // First try from current file's directory - resolvedPath = require.resolve(packagePath, { - paths: [currentFileDir] - }); - } catch (e) { - // Fallback to current working directory - resolvedPath = require.resolve(packagePath, { - paths: [process.cwd()] - }); - } - - // Convert to relative path for the original plugin - const relativePath = path.relative(currentFileDir, resolvedPath); - atRule.params = `"${relativePath}"`; - } catch (error) { - // If resolution fails, try manual node_modules lookup - try { - let currentDir = path.dirname( - atRule.source.input.file || process.cwd() - ); - let found = false; - - // Walk up directories to find node_modules - while (currentDir !== path.parse(currentDir).root && !found) { - const moduleDir = path.join( - currentDir, - 'node_modules', - packagePath - ); - if (fs.existsSync(moduleDir)) { - const relativePath = path.relative( - path.dirname(atRule.source.input.file || ''), - moduleDir - ); - atRule.params = `"${relativePath}"`; - found = true; - break; - } - currentDir = path.dirname(currentDir); - } - - if (!found) { - console.warn(`Could not resolve module path: ${packagePath}`); - } - } catch (fallbackError) { - console.warn( - `Failed to resolve ${packagePath}:`, - fallbackError.message - ); - } - } - } - }); - } - }, - // Support importing JSON files in CSS - original plugin (for non-~ paths) - [ - '@daltontan/postcss-import-json', - { - map: (selector, value) => { - if (typeof value === 'object' && value !== null && value.$ref) { - const tokenPath = value.$ref.split('#/')[1]; - const cssVariableName = '--' + tokenPath.replace(/\//g, '-'); - - return `var(${cssVariableName})`; - } - return value; - } - } - ] - ].filter(Boolean) - }, - sourceMap: shouldUseSourceMap - } - } - ]; - if (preProcessor) { - loaders.push(preProcessor); - } - return loaders; - }; - - const getLessStyleLoaders = cssLoaderOptions => - getStyleLoaders(cssLoaderOptions, { - loader: require.resolve('less-loader'), - options: { - lessOptions: { - modifyVars: Object.assign({__DEV__: !isEnvProduction}, app.accent) - }, - sourceMap: shouldUseSourceMap - } - }); - - const getScssStyleLoaders = cssLoaderOptions => - getStyleLoaders(cssLoaderOptions, { - loader: require.resolve('sass-loader'), - options: { - sourceMap: shouldUseSourceMap - } - }); - - const getAdditionalModulePaths = paths => { - if (!paths) return []; - return Array.isArray(paths) ? paths : [paths]; - }; - - return { - mode: isEnvProduction ? 'production' : 'development', - // Don't attempt to continue if there are any errors. - bail: true, - // Webpack noise constrained to errors only - stats: 'errors-only', - // Use source maps during development builds or when specified by GENERATE_SOURCEMAP - devtool: shouldUseSourceMap && (isEnvProduction ? 'source-map' : 'cheap-module-source-map'), - // These are the "entry points" to our application. - entry: { - main: [ - // Include any polyfills needed for the target browsers. - require.resolve('./polyfills'), - // This is your app's code - app.context - ] - }, - output: { - // The build output directory. - path: path.resolve('./dist'), - // Generated JS file names (with nested folders). - // There will be one main bundle, and one file per asynchronous chunk. - // We don't currently advertise code splitting but Webpack supports it. - filename: contentHash ? '[name].[contenthash].js' : '[name].js', - // There are also additional JS chunk files if you use code splitting. - chunkFilename: contentHash ? 'chunk.[name].[contenthash].js' : 'chunk.[name].js', - assetModuleFilename: contentHash ? '[path][name][contenthash][ext]' : '[path][name][ext]', - // Add /* filename */ comments to generated require()s in the output. - pathinfo: !isEnvProduction, - publicPath, - // Improved sourcemap path name mapping for system filepaths - devtoolModuleFilenameTemplate: info => { - let file = isEnvProduction ? - path.relative(app.context, info.absoluteResourcePath) : - path.resolve(info.absoluteResourcePath); - file = file.replace(/\\/g, '/').replace(/\.\./g, '_'); - const loader = info.allLoaders.match(/[^\\/]+-loader/); - if (info.resource.includes('.less') && loader) { - // Temporary special handling for LESS files. The css-loader will - // output absolute-path mapped LESS sourcemaps, unaffected by this - // function, while both css-loader and style-loader pseudo modules - // will get their own sourcemaps. Good to differentiate. - return file + '?' + loader[0]; - } else { - return file; - } - } - }, - cache: { - type: 'filesystem', - version: createEnvironmentHash(Object.keys(process.env)), - cacheDirectory: path.resolve('./node_modules/.cache'), - store: 'pack', - buildDependencies: { - defaultWebpack: ['webpack/lib/'], - config: [__filename], - tsconfig: useTypeScript ? ['tsconfig.json'] : [] - } - }, - infrastructureLogging: { - level: 'none' - }, - ignoreWarnings: [ - // We ignore 'Module not found' warnings from SnapshotPlugin - { - module: /SnapshotPlugin/, - message: /Module not found/ - } - ], - resolve: { - // These are the reasonable defaults supported by the React/ES6 ecosystem. - extensions: ['.js', '.mjs', '.jsx', '.ts', '.tsx', '.json'].filter( - ext => useTypeScript || !ext.includes('ts') - ), - // Allows us to specify paths to check for module resolving. - modules: [ - path.resolve('./node_modules'), - 'node_modules', - ...getAdditionalModulePaths(app.additionalModulePaths) - ], - // Don't resolve symlinks to their underlying paths - symlinks: false, - // Backward compatibility for apps using new ilib references with old Enact - // and old apps referencing old iLib location with new Enact - alias: Object.assign( - { - 'react-is': path.dirname(require.resolve('react-is/package.json')) - }, - fs.existsSync(path.join(app.context, 'node_modules', '@enact', 'i18n', 'ilib')) ? - {ilib: '@enact/i18n/ilib'} : - {'@enact/i18n/ilib': 'ilib'}, - app.alias - ), - // Optional configuration for redirecting module requests. - fallback: app.resolveFallback - }, - // @remove-on-eject-begin - // Resolve loaders (webpack plugins for CSS, images, transpilation) from the - // directory of `@enact/cli` itself rather than the project directory. - resolveLoader: { - modules: [path.resolve(__dirname, '../node_modules'), path.resolve('./node_modules')] - }, - // @remove-on-eject-end - module: { - rules: [ - shouldUseSourceMap && { - enforce: 'pre', - exclude: /@babel(?:\/|\\{1,2})runtime/, - test: /\.(js|mjs|jsx|ts|tsx|css)$/, - loader: require.resolve('source-map-loader') - }, - { - // "oneOf" will traverse all following loaders until one will - // match the requirements. When no loader matches it will fall - // back to the "file" loader at the end of the loader list. - oneOf: [ - // Process JS with Babel. - { - test: /\.(js|mjs|jsx|ts|tsx)$/, - exclude: /node_modules.(?!@enact)/, - loader: require.resolve('babel-loader'), - options: { - configFile: path.join(__dirname, 'babel.config.js'), - babelrc: false, - // This is a feature of `babel-loader` for webpack (not Babel itself). - // It enables caching results in ./node_modules/.cache/babel-loader/ - // directory for faster rebuilds. - cacheDirectory: !isEnvProduction, - cacheCompression: false, - compact: isEnvProduction - } - }, - // Style-based rules support both LESS and CSS format, with *.module.* extension format - // to designate CSS modular support. - // See comments within `getStyleLoaders` for details on the stylesheet loader chains and - // options used at each level of processing. - { - test: /\.module\.css$/, - use: getStyleLoaders({ - importLoaders: 1, - modules: { - ...(isEnvProduction ? {} : {getLocalIdent}) - } - }) - }, - { - test: /\.css$/, - // The `forceCSSModules` Enact build option can be set true to universally apply - // modular CSS support. - use: getStyleLoaders({ - importLoaders: 1, - modules: { - ...(app.forceCSSModules ? {} : {mode: 'icss'}), - ...(!app.forceCSSModules && isEnvProduction ? {} : {getLocalIdent}) - } - }), - // Don't consider CSS imports dead code even if the - // containing package claims to have no side effects. - // Remove this when webpack adds a warning or an error for this. - // See https://github.com/webpack/webpack/issues/6571 - sideEffects: true - }, - { - test: /\.module\.less$/, - use: getLessStyleLoaders({ - importLoaders: 2, - modules: { - ...(isEnvProduction ? {} : {getLocalIdent}) - } - }) - }, - { - test: /\.less$/, - use: getLessStyleLoaders({ - importLoaders: 2, - modules: { - ...(app.forceCSSModules ? {} : {mode: 'icss'}), - ...(!app.forceCSSModules && isEnvProduction ? {} : {getLocalIdent}) - } - }), - sideEffects: true - }, - // Opt-in support for CSS Modules, but using SASS - // using the extension .module.scss or .module.sass - { - test: /\.module\.(scss|sass)$/, - use: getScssStyleLoaders({ - importLoaders: 3, - modules: { - ...(isEnvProduction ? {} : {getLocalIdent}) - } - }) - }, - // Opt-in support for SASS (using .scss or .sass extensions) - { - test: /\.(scss|sass)$/, - use: getScssStyleLoaders({ - importLoaders: 3, - modules: { - ...(app.forceCSSModules ? {} : {mode: 'icss'}), - ...(!app.forceCSSModules && isEnvProduction ? {} : {getLocalIdent}) - } - }) - }, - // "file" loader handles on all files not caught by the above loaders. - // When you `import` an asset, you get its output filename and the file - // is copied during the build process. - { - // Exclude `js` files to keep "css" loader working as it injects - // its runtime that would otherwise be processed through "file" loader. - // Also exclude `html` and `json` extensions so they get processed - // by webpacks internal loaders. - // Exclude `ejs` HTML templating language as that's handled by - // the HtmlWebpackPlugin. - exclude: [/^$/, /\.(js|mjs|jsx|ts|tsx)$/, /\.html$/, /\.ejs$/, /\.json$/], - type: 'asset/resource' - } - // ** STOP ** Are you adding a new loader? - // Make sure to add the new loader(s) before the "file" loader. - ] - } - ].filter(Boolean) - }, - // Target app to build for a specific environment (default 'browserslist') - target: app.environment, - // Optional configuration for polyfilling NodeJS built-ins. - node: app.nodeBuiltins, - performance: false, - optimization: { - minimize: isEnvProduction, - // These are only used in production mode - minimizer: [ - new TerserPlugin({ - terserOptions: { - parse: { - // we want uglify-js to parse ecma 8 code. However, we don't want it - // to apply any minfication steps that turns valid ecma 5 code - // into invalid ecma 5 code. This is why the 'compress' and 'output' - // sections only apply transformations that are ecma 5 safe - // https://github.com/facebook/create-react-app/pull/4234 - ecma: 8 - }, - compress: { - ecma: 5, - warnings: false, - // Disabled because of an issue with Uglify breaking seemingly valid code: - // https://github.com/facebook/create-react-app/issues/2376 - // Pending further investigation: - // https://github.com/mishoo/UglifyJS2/issues/2011 - comparisons: false, - // Disabled because of an issue with Terser breaking valid code: - // https://github.com/facebook/create-react-app/issues/5250 - // Pending futher investigation: - // https://github.com/terser-js/terser/issues/120 - inline: 2 - }, - mangle: { - safari10: true - }, - output: { - ecma: 5, - comments: false, - // Turned on because emoji and regex is not minified properly using default - // https://github.com/facebook/create-react-app/issues/2488 - // eslint-disable-next-line camelcase - ascii_only: true - } - }, - // Use multi-process parallel running to improve the build speed - // Default number of concurrent runs: os.cpus().length - 1 - parallel: true - }), - new CssMinimizerPlugin() - ], - splitChunks: noSplitCSS && { - cacheGroups: { - styles: { - name: 'main', - type: 'css/mini-extract', - chunks: 'all', - enforce: true - } - } - } - }, - plugins: [ - // Generates an `index.html` file with the js and css tags injected. - new HtmlWebpackPlugin({ - // Title can be specified in the package.json enact options or will - // be determined automatically from any appinfo.json files discovered. - title: app.title || '', - inject: 'body', - template: app.template || path.join(__dirname, 'html-template.ejs'), - xhtml: true, - minify: isEnvProduction && { - removeComments: true, - collapseWhitespace: false, - removeRedundantAttributes: true, - useShortDoctype: true, - removeEmptyAttributes: true, - removeStyleLinkTypeAttributes: true, - keepClosingSlash: true, - minifyJS: true, - minifyCSS: true, - minifyURLs: true - } - }), - // Make NODE_ENV environment variable available to the JS code, for example: - // if (process.env.NODE_ENV === 'production') { ... }. - // It is absolutely essential that NODE_ENV was set to production here. - // Otherwise React will be compiled in the very slow development mode. - new DefinePlugin({ - 'process.env.NODE_ENV': JSON.stringify(isEnvProduction ? 'production' : 'development'), - 'process.env.PUBLIC_URL': JSON.stringify(publicPath), - // Define ENACT_PACK_ISOMORPHIC global variable to determine to use - // `hydrateRoot` for isomorphic build and `createRoot` for non-isomorphic build by app. - ENACT_PACK_ISOMORPHIC: isomorphic, - // Define ENACT_PACK_NO_ANIMATION global variable to determine - // whether to build including effects such as animation or shadow or not. - ENACT_PACK_NO_ANIMATION: noAnimation - }), - // Inject prefixed environment variables within code, when used - new EnvironmentPlugin(Object.keys(process.env).filter(key => /^(REACT_APP|WDS_SOCKET)/.test(key))), - // Note: this won't work without MiniCssExtractPlugin.loader in `loaders`. - !process.env.INLINE_STYLES && - new MiniCssExtractPlugin({ - filename: contentHash ? '[name].[contenthash].css' : '[name].css', - chunkFilename: contentHash ? 'chunk.[name].[contenthash].css' : 'chunk.[name].css', - ignoreOrder: noSplitCSS - }), - // Webpack5 removed node polyfills but we need this to run screenshot tests - new NodePolyfillPlugin({ - additionalAliases: ['console', 'domain', 'process', 'stream'] - }), - // Provide meaningful information when modules are not found - new ModuleNotFoundPlugin(app.context), - // Ensure correct casing in module filepathes - new CaseSensitivePathsPlugin(), - // Switch the internal NodeOutputFilesystem to use graceful-fs to avoid - // EMFILE errors when hanndling mass amounts of files at once, such as - // what happens when using ilib bundles/resources. - new GracefulFsPlugin(), - // Automatically configure iLib library within @enact/i18n. Additionally, - // ensure the locale data files and the resource files are copied during - // the build to the output directory. - new ILibPlugin({publicPath, symlinks: false, ilibAdditionalResourcesPath}), - // Automatically detect ./appinfo.json and ./webos-meta/appinfo.json files, - // and parses any to copy over any webOS meta assets at build time. - new WebOSMetaPlugin({htmlPlugin: HtmlWebpackPlugin}), - // TypeScript type checking - useTypeScript && - new ForkTsCheckerWebpackPlugin({ - async: !isEnvProduction, - typescript: { - typescriptPath: resolve.sync('typescript', { - basedir: 'node_modules' - }), - configOverwrite: { - compilerOptions: { - sourceMap: shouldUseSourceMap, - skipLibCheck: true, - inlineSourceMap: false, - declarationMap: false, - noEmit: true, - incremental: true, - tsBuildInfoFile: 'node_modules/.cache/tsconfig.tsbuildinfo' - } - }, - context: app.context, - diagnosticOptions: { - syntactic: true - }, - mode: 'write-references' - // profile: true, - }, - issue: { - // prettier-ignore - include: [ - {file: '../**/src/**/*.{ts,tsx}'}, - {file: '**/src/**/*.{ts,tsx}'} - ], - exclude: [ - {file: '**/src/**/__tests__/**'}, - {file: '**/src/**/?(*.){spec|test}.*'}, - {file: '**/src/setupProxy.*'}, - {file: '**/src/setupTests.*'} - ] - }, - logger: { - infrastructure: 'silent' - } - }), - !noLinting && - new ESLintPlugin({ - // Plugin options - configType: 'flat', - extensions: ['js', 'mjs', 'jsx', 'ts', 'tsx'], - formatter: require.resolve('react-dev-utils/eslintFormatter'), - eslintPath: require.resolve('eslint'), - // @remove-on-eject-begin - overrideConfigFile: require.resolve('./eslintWebpackPluginConfig'), - // @remove-on-eject-end - cache: true - }) - ].filter(Boolean) - }; -}; diff --git a/docs/building-apps.md b/docs/building-apps.md index a2014e40..ba971d50 100644 --- a/docs/building-apps.md +++ b/docs/building-apps.md @@ -125,7 +125,7 @@ To use Sass, install Sass globally: npm install -g sass ``` -Now you can rename `src/App.css` to `src/App.scss` or `src/App.sass` and for using CSS modules, `src/App.module.scss` or `src/App.module.sass`. And update `src/App.js` to import `src/App.scss`. Enact CLI will compile these files properly through webpack for you. +Now you can rename `src/App.css` to `src/App.scss` or `src/App.sass` and for using CSS modules, `src/App.module.scss` or `src/App.module.sass`. And update `src/App.js` to import `src/App.scss`. Enact CLI will compile these files properly through Bun for you. More information can be found [here](https://sass-lang.com/guide) to learn about Sass. @@ -233,7 +233,7 @@ To accommodate devices with lower performance, the Enact CLI offers the `--no-an ## Caching -For supporting better [`caching`](https://webpack.js.org/guides/caching/), Enact CLI provides `--content-hash` option to add a unique hash to each output file name based on the content of an asset. +For supporting better caching, Enact CLI provides `--content-hash` option to add a unique hash to each output file name based on the content of an asset. Building With this option should produce the following output: @@ -248,7 +248,7 @@ When the content changes, the output file name will change as well. 199.85 kB dist/main.2088c66150ab73b27793.css ``` -> **NOTE** The filename `main.*.js` will be changed after another building, even without making any changes. This is because webpack includes certain boilerplate, specifically the runtime and manifest, in the entry chunk. +> **NOTE** The filename `main.*.js` may change after another building, even without making changes, depending on bundler runtime output. ## Isomorphic Support & Prerendering By using the isomorphic code layout option, your project bundle will be outputted in a versatile universal code format allowing potential usage outside the browser. The Enact CLI takes advantage of this mode by additionally generating an HTML output of your project and embedding it directly with the resulting **index.html**. By default, isomorphic mode will attempt to prerender only `en-US`, however with the `--locales` option, a wide variety of locales can be specified and prerendered. More details on isomorphic support and its limitations can be found [here](./isomorphic-support.md). @@ -260,7 +260,10 @@ The v8 snapshot blob creation feature is highly experimental and temperamental d Similar to the [`enact serve`](./serving-apps.md) command, the watcher will build the project and wait for any detected source code changes. When a change is detected, it will rebuild the project. The rebuild time will be significantly faster since the process can actively cache and build only what has changed. ## Stats Analysis -The Bundle analysis file option uses the popular [webpack-bundle-analyzer](https://github.com/webpack-contrib/webpack-bundle-analyzer) to create a visual representation of the project build to **stats.html**, showing the full module hierarchy arranged by output size. This can be very useful in determining where bloat is coming from or finding dependencies that may have been included by mistake. +The `--stats` option generates bundle analysis files in the output directory using Bun's build metafile: + +* **stats.html** — static report with largest modules and output breakdown +* **stats.json** — raw metafile data (compatible with [esbuild's bundle analyzer](https://esbuild.github.io/analyze/)) ## Override Metadata The @enact/cli tool inspects the `enact` object in the project's package.json for [customization options](./starting-a-new-app.md#enact-project-settings). diff --git a/docs/ejecting-apps.md b/docs/ejecting-apps.md index fdcc0c25..eed33940 100644 --- a/docs/ejecting-apps.md +++ b/docs/ejecting-apps.md @@ -12,7 +12,7 @@ sidebar: Options -b, --bare Abandon Enact CLI command enhancements and eject into a a barebones setup (using - webpack, eslint, jest, etc. directly) + Bun, eslint, jest, etc. directly) -v, --version Display version information -h, --help Display help information ``` @@ -20,11 +20,11 @@ The `enact eject` command will permanently eject an app from within the Enact CL ## Should I Eject My App? -A question that may come up during the course of development is whether to eject an app for customization purposes. The default configuration of the Enact CLI tool is designed to meet the majority of use cases and keep the development environment abstracted. In rare circumstances where a webpack or Babel config customization is absolutely required, it may be necessary to eject. It is very important to leave ejection as a last resort since it will greatly increase the complexity of the app's dependencies and will remove the ability to take advantage of Enact CLI updates and improvements; the entirety of the app development cycle will now be up to you to maintain. +A question that may come up during the course of development is whether to eject an app for customization purposes. The default configuration of the Enact CLI tool is designed to meet the majority of use cases and keep the development environment abstracted. In rare circumstances where a Bun or Babel config customization is absolutely required, it may be necessary to eject. It is very important to leave ejection as a last resort since it will greatly increase the complexity of the app's dependencies and will remove the ability to take advantage of Enact CLI updates and improvements; the entirety of the app development cycle will now be up to you to maintain. ## Post-Eject Development Environment -Once an app is ejected, its structure will be changed fairly noticeable. All the polyfills and development tools (babel, webpack, less, jest, eslint, etc.) will be added to the **package.json** and the run-scripts will be updated to use them. Afterwards, your project should look like this: +Once an app is ejected, its structure will be changed fairly noticeable. All the polyfills and development tools (babel, Bun, less, jest, eslint, etc.) will be added to the **package.json** and the run-scripts will be updated to use them. Afterwards, your project should look like this: ```none my-app/ README.md @@ -37,7 +37,9 @@ my-app/ babel.config.js dotenv.js html-template.ejs - webpack.config.js + bun/ + build.mjs + dev-server.mjs jest/ babelTransform.js fileTransform.js @@ -55,4 +57,4 @@ my-app/ webos-meta/ ``` -The **config** directory will contain all the main development configuration files: babel, webpack, and jest, along with polyfill setup files. Additionally, a **scripts** directory will be generated, containing shorthand wrapper scripts that replicate the Enact CLI output styling/usage. These scripts will keep a consistent developer experience between ejected and non-ejected apps. However, if `-b`/`--bare` flag is used during ejection, no scripts will be generated and the npm run-scripts will harness the raw tools (webpack/jest/eslint/etc) directly. +The **config** directory will contain all the main development configuration files: babel, Bun build scripts, and jest, along with polyfill setup files. Additionally, a **scripts** directory will be generated, containing shorthand wrapper scripts that replicate the Enact CLI output styling/usage. These scripts will keep a consistent developer experience between ejected and non-ejected apps. However, if `-b`/`--bare` flag is used during ejection, no scripts will be generated and the npm run-scripts will harness the raw tools (Bun/jest/eslint/etc) directly. diff --git a/docs/index.md b/docs/index.md index 72d40a41..b26dbaf7 100644 --- a/docs/index.md +++ b/docs/index.md @@ -4,7 +4,9 @@ sidebar: order: 1 --- -The Enact CLI package provides a command-line tool for creating and building Enact applications. It leverages powerful open source tools and technologies such as [webpack](https://webpack.js.org), [Babel](https://babeljs.io), [LESS](http://lesscss.org), and [Jest](https://jestjs.io) to provide a development environment for apps that requires zero configuration to get started. +The Enact CLI package provides a command-line tool for creating and building Enact applications. It leverages [Bun](https://bun.com) as its bundler and development server, along with [Babel](https://babeljs.io), [LESS](http://lesscss.org), and [Jest](https://jestjs.io) to provide a development environment for apps that requires zero configuration to get started. + +**Requirements:** Node.js 20.12+ and [Bun 1.3+](https://bun.com/docs/installation). The following sections describe its installation and usage: diff --git a/docs/installation.md b/docs/installation.md index dcbf2642..248124f4 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -5,7 +5,10 @@ sidebar: --- ## Requirements -Node 10 LTS or later. +* Node.js 20.12+, 22.x, or 24+ +* [Bun](https://bun.com) 1.3+ (bundler and dev server) + +Install Bun from https://bun.com/docs/installation before using `@enact/cli` v8+. ## Installation via npm diff --git a/docs/isomorphic-support.md b/docs/isomorphic-support.md index 52609375..e227b571 100644 --- a/docs/isomorphic-support.md +++ b/docs/isomorphic-support.md @@ -87,6 +87,6 @@ When multiple locales are specified for prerendering, each locale is evaluated i ## How It Works With an isomorphic build, the app is built in a special pseudo-library layout, in a universal module definition ([UMD](https://github.com/umdjs/umd)) format. In a Node environment, the top-level export is the `ReactElement` export of the 'isomorphic' file. In a browser environment, the app executes normally. -During the build process, a custom webpack plugin, `PrerenderPlugin`, will access the build within its Node environment and use React's [`ReactDOMServer`](https://reactjs.org/docs/react-dom-server.html#rendertostring) to render the initial state of the app into an HTML string and inject that into the **index.html** file, within the `root` ID `div` element. This is the same API used in server-side rendering. +During the build process, the `PrerenderPlugin` post-build step accesses the bundle within its Node environment and uses React's [`ReactDOMServer`](https://reactjs.org/docs/react-dom-server.html#rendertostring) to render the initial state of the app into an HTML string and inject that into the **index.html** file, within the `root` ID `div` element. This is the same API used in server-side rendering. When the webpage loads up in a browser environment, the built JavaScript is loaded normally (and is expected to render itself into the HTML), except React will detect the DOM tree and will simply attach event listeners and go through the React lifecycle methods. diff --git a/docs/loading-existing-app.md b/docs/loading-existing-app.md index e4d3e585..031c8246 100644 --- a/docs/loading-existing-app.md +++ b/docs/loading-existing-app.md @@ -22,7 +22,7 @@ npm install ## Available npm Tasks npm tasks vary by package and are defined within a `scripts` object in the **package.json** file. If the app was created via the Enact CLI, then it will support the following npm task aliases: -* `npm run serve` - Packages and hosts the app on a local http server using [webpack-dev-server](https://github.com/webpack/webpack-dev-server). Supports hot module replacement and inline updates as the source code changes. +* `npm run serve` - Packages and hosts the app on a local http server using Bun's development server with HMR. Supports hot module replacement and inline updates as the source code changes. * `npm run pack` - Packages the app into **./dist** in development mode (unminified code, with any applicable development code). * `npm run pack-p` - Packages the app into **./dist** in production mode (minified code, with development code dropped). * `npm run watch` - Packages in development mode and sets up a watcher that will rebuild the app whenever the source code changes. diff --git a/docs/serving-apps.md b/docs/serving-apps.md index e71d82c2..b1f275ec 100644 --- a/docs/serving-apps.md +++ b/docs/serving-apps.md @@ -18,7 +18,7 @@ sidebar: -v, --version Display version information -h, --help Display help information ``` -The `enact serve` command (aliased as `npm run serve`) will build and host your project on **http://localhost:8080/**. The options allow you to customize the host IP and host port, which can also be overriden via `HOST` and `PORT` environment variable. While the `enact serve` is active, any changes to source code will trigger a rebuild and update any loaded browser windows. +The `enact serve` command (aliased as `npm run serve`) will build and host your project on **http://localhost:8080/** using Bun's full-stack development server with hot module replacement. The options allow you to customize the host IP and host port, which can also be overriden via `HOST` and `PORT` environment variable. While the `enact serve` is active, any changes to source code will trigger a rebuild and update any loaded browser windows. ## Custom Proxy diff --git a/docs/starting-a-new-app.md b/docs/starting-a-new-app.md index 696384be..6578ee54 100644 --- a/docs/starting-a-new-app.md +++ b/docs/starting-a-new-app.md @@ -22,7 +22,7 @@ This will generate a basic app based on the Limestone project template, complete ## Enact Project Settings The @enact/cli tool will check the project's **package.json** looking for an optional `enact` object for a few customization options: -* `template` _[string]_ - Filepath to an alternate HTML template to use with the [Webpack html-webpack-plugin](https://github.com/jantimon/html-webpack-plugin). +* `template` _[string]_ - Filepath to an alternate HTML template used when generating **index.html**. * `isomorphic` _[string]_ - Alternate filepath to a custom isomorphic-compatible entry point. Not needed if main entry point is already isomorphic-compatible. * `title` _[string]_ - Title text that should be put within the HTML's `` tags. Note: if this is a webOS-project, the title will, by default, be auto-detected from the **appinfo.json** content. * `theme` _[object]_ - A simplified string name to extrapolate `fontGenerator`, `ri`, and `screenTypes` preset values from. For example, `"limestone"`. @@ -30,12 +30,12 @@ The @enact/cli tool will check the project's **package.json** looking for an opt * `ri` _[object]_ - Resolution independence options to be forwarded to the [postcss-resolution-independence](https://github.com/enactjs/postcss-resolution-independence). By default, will use any preset for a specified theme or fallback to limestone. * `baseSize` _[number]_ - The root font-size to use when converting the value of the base unit to a resolution-independent unit. For example, when `baseSize` is set to 24, 48px in the LESS file will be converted to 2rem. * `screenTypes` _[array|string]_ - Array of 1 or more screentype definitions to be used with prerender HTML initialization. Can alternatively reference a json filepath to read for screentype definitions. By default, will use any preset for a specified theme or fallback to limestone. -* `nodeBuiltins` _[object]_ - Configuration settings for polyfilling NodeJS built-ins. See `node` [webpack option](https://webpack.js.org/configuration/node/). -* `resolveFallback` _[object]_ - Configuration settings for redirecting module requests when normal resolving fails. See `resolve.fallback` [webpack option](https://webpack.js.org/configuration/resolve/#resolvefallback). +* `nodeBuiltins` _[object]_ - Configuration settings for polyfilling NodeJS built-ins. +* `resolveFallback` _[object]_ - Configuration settings for redirecting module requests when normal resolving fails. * `externalStartup` _[boolean]_ - Flag whether to externalize the startup/update js that is normally inlined within prerendered app HTML output. * `forceCSSModules` _[boolean]_ - Flag whether to force all LESS/CSS to be processed in a modular context (not just the `*.module.css` and `*.module.less` files). * `deep` _[string|array]_ - 1 or more JavaScript conditions that, when met, indicate deeplinking and any prerender should be discarded. -* `target` _[string|array]_ - A build-type generic preset string (see `target` [webpack option](https://webpack.js.org/configuration/target/)) or alternatively a specific [browserslist array](https://github.com/browserslist/browserslist) of desired targets. +* `target` _[string|array]_ - A build-type generic preset string or alternatively a specific [browserslist array](https://github.com/browserslist/browserslist) of desired targets. * `proxy` _[string]_ - Proxy target during project `serve` to be used within the [http-proxy-middleware](https://github.com/chimurai/http-proxy-middleware). For example: @@ -60,7 +60,7 @@ For example: ## Available npm Tasks Included within the project template are a number of npm tasks available, with each mapped to Enact CLI commands: -* `npm run serve` - Packages and hosts the app on a local http server using [webpack-dev-server](https://github.com/webpack/webpack-dev-server). Supports hot module replacement and inline updates as the source code changes. +* `npm run serve` - Packages and hosts the app on a local http server using Bun's development server with HMR. Supports hot module replacement and inline updates as the source code changes. * `npm run pack` - Packages the app into **./dist** in development mode (unminified code, with any applicable development code). * `npm run pack-p` - Packages the app into **./dist** in production mode (minified code, with development code dropped). * `npm run watch` - Packages in development mode and sets up a watcher that will rebuild the app whenever the source code changes. diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 3b4cc045..99eaf4fe 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -9,51 +9,41 @@ "version": "7.3.3", "license": "Apache-2.0", "dependencies": { + "@babel/core": "^7.29.0", "@babel/plugin-transform-modules-commonjs": "^7.29.7", "@daltontan/postcss-import-json": "^1.1.1", "@enact/dev-utils": "^7.0.5", "@enact/template-limestone": "1.0.0", - "@pmmmwh/react-refresh-webpack-plugin": "^0.6.2", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", "@testing-library/user-event": "^14.6.1", "babel-jest": "^30.4.1", - "babel-loader": "^10.1.1", "babel-plugin-dynamic-import-node": "^2.3.3", "babel-plugin-transform-rename-import": "^2.3.0", "babel-preset-enact": "^0.1.17", - "case-sensitive-paths-webpack-plugin": "^2.4.0", + "bun": "^1.3.14", "chalk": "^5.6.2", "core-js": "3.22.8", "cross-spawn": "^7.0.6", - "css-loader": "^7.1.4", - "css-minimizer-webpack-plugin": "^8.0.0", "dotenv": "^17.4.2", "dotenv-expand": "^13.0.0", "eslint": "^9.39.4", "eslint-config-enact": "^5.1.2", - "eslint-webpack-plugin": "^6.0.0", - "expose-loader": "^5.0.1", - "file-loader": "^6.2.0", "filesize": "^11.0.19", "fs-extra": "^11.3.6", "glob": "^13.0.6", "global-modules": "^2.0.0", - "html-webpack-plugin": "^5.6.7", "identity-obj-proxy": "^3.0.0", "jest": "~30.3.0", "jest-environment-jsdom": "29.7.0", "jest-watch-typeahead": "^3.0.1", "less": "^4.6.7", - "less-loader": "^12.3.2", "less-plugin-npm-import": "^2.1.0", "license-checker": "^25.0.1", - "mini-css-extract-plugin": "^2.10.2", "minimist": "^1.2.8", - "node-polyfill-webpack-plugin": "4.0.0", "postcss": "^8.5.16", "postcss-flexbugs-fixes": "^5.0.2", - "postcss-loader": "^8.2.1", + "postcss-modules": "^6.0.1", "postcss-normalize": "^13.0.1", "postcss-preset-env": "^11.3.2", "postcss-resolution-independence": "^1.1.11", @@ -66,16 +56,11 @@ "react-test-renderer": "^19.2.7", "resolution-independence": "^1.0.0", "resolve": "^1.22.12", - "sass-loader": "^16.0.7", + "sass": "^1.101.0", "semver": "^7.8.5", - "source-map-loader": "^5.0.0", "strip-ansi": "^7.2.0", - "style-loader": "^4.0.0", "tar": "^7.5.19", - "terser-webpack-plugin": "^5.6.1", - "validate-npm-package-name": "^7.0.2", - "webpack": "^5.108.4", - "webpack-dev-server": "^5.2.5" + "validate-npm-package-name": "^7.0.2" }, "bin": { "enact": "bin/enact.js" @@ -88,6 +73,7 @@ "prettier": "^3.9.4" }, "engines": { + "bun": ">=1.3.0", "node": "^20.12.0 || ^22.0.0 || >=24.0.0" }, "optionalDependencies": { @@ -2041,12 +2027,6 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "license": "MIT" }, - "node_modules/@colordx/core": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@colordx/core/-/core-5.5.0.tgz", - "integrity": "sha512-3PxTH8itZzltK0U9jTwVVnjLXvnDYuq3m+QXsHkENxWiPRh4WaoLcs1SQjqgZ55kS+QyirpH5BVwzP2gMVG6EQ==", - "license": "MIT" - }, "node_modules/@csstools/cascade-layer-name-parser": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-3.0.0.tgz", @@ -3747,8 +3727,9 @@ "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" @@ -3758,8 +3739,9 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.0.0" } @@ -3768,8 +3750,9 @@ "version": "0.3.11", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" @@ -3779,15 +3762,17 @@ "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "extraneous": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -3858,22 +3843,25 @@ "version": "1.0.9", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", - "extraneous": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/@types/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "extraneous": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "extraneous": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/@types/json5": { "version": "0.0.29", @@ -3886,8 +3874,9 @@ "version": "26.0.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-26.0.0.tgz", "integrity": "sha512-vf2YFi1iY9lHGwNJMs01biZFbKJkrZR1T6/MlzjhJLPdntOHLhTrDSnSVcdtvjihi4VQNlrFRIxLsDBlQpAipA==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "undici-types": "~8.3.0" } @@ -3896,8 +3885,9 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2" @@ -3907,29 +3897,33 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "extraneous": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/@webassemblyjs/helper-api-error": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "extraneous": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/@webassemblyjs/helper-buffer": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "extraneous": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/@webassemblyjs/helper-numbers": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.13.2", "@webassemblyjs/helper-api-error": "1.13.2", @@ -3940,15 +3934,17 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "extraneous": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -3960,8 +3956,9 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -3970,8 +3967,9 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "extraneous": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@xtuc/long": "4.2.2" } @@ -3980,15 +3978,17 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "extraneous": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/@webassemblyjs/wasm-edit": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -4004,8 +4004,9 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", @@ -4018,8 +4019,9 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -4031,8 +4033,9 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-api-error": "1.13.2", @@ -4046,8 +4049,9 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" @@ -4057,15 +4061,17 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "extraneous": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "extraneous": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/acorn": { "version": "8.17.0", @@ -4083,8 +4089,9 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10.13.0" }, @@ -4135,8 +4142,9 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ajv": "^8.0.0" }, @@ -4153,8 +4161,9 @@ "version": "8.20.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -4170,15 +4179,17 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "extraneous": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=8" } @@ -4383,8 +4394,9 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "extraneous": true, - "license": "ISC" + "license": "ISC", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/brace-expansion": { "version": "1.1.15", @@ -4446,8 +4458,9 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "extraneous": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/call-bind": { "version": "1.0.9", @@ -4512,8 +4525,9 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" @@ -4555,8 +4569,9 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.0" } @@ -4565,8 +4580,9 @@ "version": "5.3.3", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "source-map": "~0.6.0" }, @@ -4598,8 +4614,9 @@ "version": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 12" } @@ -4663,8 +4680,9 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "extraneous": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.0.1", @@ -4680,8 +4698,9 @@ "version": "6.2.2", "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", - "extraneous": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "engines": { "node": ">= 6" }, @@ -4821,8 +4840,9 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "utila": "~0.4" } @@ -4831,8 +4851,9 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", @@ -4846,21 +4867,23 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "extraneous": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/fb55" } ], - "license": "BSD-2-Clause" + "license": "BSD-2-Clause", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/domhandler": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "extraneous": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "dependencies": { "domelementtype": "^2.2.0" }, @@ -4875,8 +4898,9 @@ "version": "2.8.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "extraneous": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", @@ -4890,8 +4914,9 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" @@ -4922,8 +4947,9 @@ "version": "5.24.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.0.tgz", "integrity": "sha512-SkE2t82KlkkxQRVMVLAGKxLfORGQfrkx5dkj+vlgXRVNEdPc4eZcR+J/Fvj8C+yKSFH5L0q3NFlyufOVQnCcYQ==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" @@ -4936,8 +4962,9 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "extraneous": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } @@ -5053,8 +5080,9 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", - "extraneous": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/es-object-atoms": { "version": "1.1.2", @@ -5204,9 +5232,11 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/eslint-config-enact/-/eslint-config-enact-5.1.2.tgz", "integrity": "sha512-nXHHZdqGiSz8GtiZ09uq3shiCugWMqL68uh89ddd98w1ybMsrqZtVBKgfPlJl6bn8l0FqGAWVgev0c/sZIi0MQ==", - "extraneous": true, + "dev": true, "hasShrinkwrap": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@babel/eslint-parser": "^7.29.7", "@babel/eslint-plugin": "^7.29.7", @@ -5234,8 +5264,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", @@ -5249,8 +5281,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.9.0" } @@ -5259,8 +5293,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", @@ -5290,8 +5326,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.29.7.tgz", "integrity": "sha512-zxt+UJTOMKvUt3yOg+D58MLuz334pHp93qifMFcjIIO+9hN6t+ufw2gi7vDPMpxvfnHRR+3VVXvIjineCcgyXw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", @@ -5309,8 +5347,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/eslint-plugin/-/eslint-plugin-7.29.7.tgz", "integrity": "sha512-9qag/N0IHYLNf0nCNvHctNGBpoY4Idr7JkPeYUf2p5J9UpvHpd+Xx6VGjHDhJKmueVBa4/cq6MPl3uxj6/8knw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "eslint-rule-composer": "^0.3.0" }, @@ -5326,8 +5366,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7", @@ -5343,8 +5385,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz", "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/types": "^7.29.7" }, @@ -5356,8 +5400,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/compat-data": "^7.29.7", "@babel/helper-validator-option": "^7.29.7", @@ -5373,8 +5419,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz", "integrity": "sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.29.7", "@babel/helper-member-expression-to-functions": "^7.29.7", @@ -5395,8 +5443,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.29.7.tgz", "integrity": "sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.29.7", "regexpu-core": "^6.3.1", @@ -5413,8 +5463,10 @@ "version": "0.6.8", "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz", "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6", @@ -5430,8 +5482,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.9.0" } @@ -5440,8 +5494,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz", "integrity": "sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/traverse": "^7.29.7", "@babel/types": "^7.29.7" @@ -5454,8 +5510,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/traverse": "^7.29.7", "@babel/types": "^7.29.7" @@ -5468,8 +5526,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-module-imports": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7", @@ -5486,8 +5546,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz", "integrity": "sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/types": "^7.29.7" }, @@ -5499,8 +5561,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.9.0" } @@ -5509,8 +5573,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.29.7.tgz", "integrity": "sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.29.7", "@babel/helper-wrap-function": "^7.29.7", @@ -5527,8 +5593,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz", "integrity": "sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-member-expression-to-functions": "^7.29.7", "@babel/helper-optimise-call-expression": "^7.29.7", @@ -5545,8 +5613,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz", "integrity": "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/traverse": "^7.29.7", "@babel/types": "^7.29.7" @@ -5559,8 +5629,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.9.0" } @@ -5569,8 +5641,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.9.0" } @@ -5579,8 +5653,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.9.0" } @@ -5589,8 +5665,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.29.7.tgz", "integrity": "sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/template": "^7.29.7", "@babel/traverse": "^7.29.7", @@ -5604,8 +5682,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/template": "^7.29.7", "@babel/types": "^7.29.7" @@ -5618,8 +5698,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/types": "^7.29.7" }, @@ -5634,8 +5716,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.29.7.tgz", "integrity": "sha512-j8SrR0zLZrRsC09DlszEx8FpMiwukKffYXMK0d5LmOglO7vGG6sz/BR/20yHqWH+Lnn31JTt2PE3hIWNgM2J6w==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7", "@babel/traverse": "^7.29.7" @@ -5651,8 +5735,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.29.7.tgz", "integrity": "sha512-r8j8escF+U2FUHo0KOhPUdMzUO+jp9fInva6+ACVAF3Y97Ev+5iNZwiqTghmzNeWwDkOPlYuTcfb1vDaoZKmAQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, @@ -5667,8 +5753,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.29.7.tgz", "integrity": "sha512-GE1TFSiuFeGsCxmYXZl8HwoPrVlwe4rHPFE8weieGKZqnDORK+Ar3vgWMgW+AOxQ6/2TgLSKx9p6W7O4rC6qgQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, @@ -5683,8 +5771,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-7.29.7.tgz", "integrity": "sha512-oBNVCvnO5tND+xSopWvV8WNGfpTfgP4Zr/YXXSj8zfmcPktp5Ku/aZlsIowgSD4fjmgHn6sGmB9APVsU5zOdhA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" @@ -5700,8 +5790,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.29.7.tgz", "integrity": "sha512-QQt9qKHZ2sg/kivaLr7lnQr8HVrQDdBNSfCsTjiDxRuX/K5ORyKq+Bu8Xr0cDE3Dfkv0cw28Ve0EKyKMvulkOw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", @@ -5718,8 +5810,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.29.7.tgz", "integrity": "sha512-pn6QacGLgvCcwc+syUhKE/qSjV2D1IHDB84RNxWYSt1mW3K/SCtjinZ2p0cETJxAWBjPy3K/1lHwG5BjjPxNlw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7", "@babel/traverse": "^7.29.7" @@ -5735,8 +5829,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.29.7.tgz", "integrity": "sha512-EtU0Hi3GvrTqD56xKmZvV/uCXK2ZbwVNPNLAquVItcAZpUhkXwWlo3Fmj0c2LxgSf2I8IDULeAepwNP1OefLXg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.29.7", "@babel/helper-plugin-utils": "^7.29.7", @@ -5753,8 +5849,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.29.7.tgz", "integrity": "sha512-p+G5BNXDcy3bOXplhY4HybQ1GxH3i2Tppmdm/3epyRu2VgJJZuUlZ61MqRTg582Q7ZLBdP7fePYvsumSEkMxcQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, @@ -5769,8 +5867,10 @@ "version": "7.21.0-placeholder-for-preset-env.2", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.9.0" }, @@ -5782,8 +5882,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.29.7.tgz", "integrity": "sha512-9MTTLbF39X6sqM92JPEsoI7++26hjZvzkxKZy64aMhWLH2mPkJ/Q3AV4QLmls3R14FpSpkOwQQfUh962JGQxxg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, @@ -5798,8 +5900,10 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -5811,8 +5915,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.29.7.tgz", "integrity": "sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, @@ -5827,8 +5933,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.29.7.tgz", "integrity": "sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, @@ -5843,8 +5951,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz", "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, @@ -5859,8 +5969,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz", "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, @@ -5875,8 +5987,10 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -5892,8 +6006,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.29.7.tgz", "integrity": "sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, @@ -5908,8 +6024,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.7.tgz", "integrity": "sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7", "@babel/helper-remap-async-to-generator": "^7.29.7", @@ -5926,8 +6044,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.29.7.tgz", "integrity": "sha512-pcUb2SS+RMo9TWVBwKGI5ShtoG7R+zBsFmCKDa6fe8c+hPr3XJlZgoE5j6i8W7gDjhyvy+85vmYexanvXh3d1w==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-module-imports": "^7.29.7", "@babel/helper-plugin-utils": "^7.29.7", @@ -5944,8 +6064,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.29.7.tgz", "integrity": "sha512-cUSmjh72N+rN4PrkFlN1dJwNCwjVp5d38/CQrEsFggkD10UiFlBFgdH3tv5dNsLuHY+3S8db2xCHjhZcv5WgvA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, @@ -5960,8 +6082,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.29.7.tgz", "integrity": "sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, @@ -5976,8 +6100,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.29.7.tgz", "integrity": "sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.29.7", "@babel/helper-plugin-utils": "^7.29.7" @@ -5993,8 +6119,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.29.7.tgz", "integrity": "sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.29.7", "@babel/helper-plugin-utils": "^7.29.7" @@ -6010,8 +6138,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.29.7.tgz", "integrity": "sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.29.7", "@babel/helper-compilation-targets": "^7.29.7", @@ -6031,8 +6161,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.29.7.tgz", "integrity": "sha512-RK7/IyU5phpuCdBAuig5VkzG/EnbDaui5SQGdU9BFrHdV+mV4cUjLMQ9lJDjLNtWHsqtiefpGZUXQP2BiTYMsA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7", "@babel/template": "^7.29.7" @@ -6048,8 +6180,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.29.7.tgz", "integrity": "sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7", "@babel/traverse": "^7.29.7" @@ -6065,8 +6199,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.29.7.tgz", "integrity": "sha512-3qc18hsD2RdZiyJNDNc7HQpv6xbncwh8FYtxNFFzclSyh/trPD9KkVR9BDECUjDLvb7yJVF15GfYUuC+LMkkiQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.29.7", "@babel/helper-plugin-utils": "^7.29.7" @@ -6082,8 +6218,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.29.7.tgz", "integrity": "sha512-6IvRRriEMqnBwD6chtxdLpMYCHWEzN+oL5cyQtjykya19UgzbmKhxmhZgKC/LHxS2nYr9Q/qYPZ5Lr6jOL9+yQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, @@ -6098,8 +6236,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.7.tgz", "integrity": "sha512-2wiIyo2BjtgU7HufSeDnL9L2O7zr8jmhFKuSr65VpRkUiRKRNpb0mdlk56+XPPKoIrfHqzbMuglDvZun0RISsA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.29.7", "@babel/helper-plugin-utils": "^7.29.7" @@ -6115,8 +6255,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.29.7.tgz", "integrity": "sha512-giOlEm/EFjfjr+te9NsdjkUo2v4f8rS/SXPumRVHAtbNcyNlvtREkU1dZzaIDclNpnaVhlCqRdFKhJBjBikzLg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, @@ -6131,8 +6273,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.29.7.tgz", "integrity": "sha512-Rstj7coNz8sE+7Ju7ihpHLI564lsK5pUpNNlvptCIC/16E/S5hbl6n3kESPKdNRmqEWlpn5xpS5Q2dvXBsySLw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7", "@babel/plugin-transform-destructuring": "^7.29.7" @@ -6148,8 +6292,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.29.7.tgz", "integrity": "sha512-zFpMOTLZBdW5LfObqcSbL6kefg4R4eLdmvS0wbN9M6D5Mym/sKm9toOoWyVOa+xDjvCnuWcHls2YonXwHvH3CQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, @@ -6164,8 +6310,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.29.7.tgz", "integrity": "sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, @@ -6180,8 +6328,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.29.7.tgz", "integrity": "sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" @@ -6197,8 +6347,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.29.7.tgz", "integrity": "sha512-otRWaHXE6fbAGkePvaj/kvs3HsqXfPhlnzwSOlnFgbqCPMd975dW+4wZ00WFBt+/YlBGcJwNrARQTOJOb4ZrIg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-compilation-targets": "^7.29.7", "@babel/helper-plugin-utils": "^7.29.7", @@ -6215,8 +6367,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.29.7.tgz", "integrity": "sha512-RRnE2+eon1rJAq8MnoF1b5kTpY1vU88twHcvcKMrsqP/jxIRqDVs9iJB5fqPuqyeFAW0wJo4MlUIPpQCq/aRsg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, @@ -6231,8 +6385,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.29.7.tgz", "integrity": "sha512-DZ/oLP21ZuWx1vKqnoNv6/tvEK48AQOBRai40CX9dTjGluvT/YZCyY3rryDtyUqCEoyNroy5KKPwX2iQCiRvyw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, @@ -6247,8 +6403,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.29.7.tgz", "integrity": "sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, @@ -6263,8 +6421,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.29.7.tgz", "integrity": "sha512-hl1kwFZCCiDyfH25Xmco9jTrkPgnS9pmOzSG7W5I4SaGbLeqKv417hcU2RKmaxoPEgsoJh7ZPOrnPGq99bHoUg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, @@ -6279,8 +6439,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.29.7.tgz", "integrity": "sha512-fxtQoH3m5ywUSIfaH0FGCzWu4McsYon5bD3K4XnskC7f+OyQMj7rsOMi4NvvmJ83WwBAg4UCe+ov4VZlqEvyew==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-module-transforms": "^7.29.7", "@babel/helper-plugin-utils": "^7.29.7" @@ -6296,8 +6458,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz", "integrity": "sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-module-transforms": "^7.29.7", "@babel/helper-plugin-utils": "^7.29.7" @@ -6313,8 +6477,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.7.tgz", "integrity": "sha512-TM2ZcQLoG2/y4HODiStCo10DibYhWhGWAwVv+EQKmG/7GFl0N+AAmUiXOMKM+aiJ9XBJ9AHVZBvTzMnJ2sM3cQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-module-transforms": "^7.29.7", "@babel/helper-plugin-utils": "^7.29.7", @@ -6332,8 +6498,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.29.7.tgz", "integrity": "sha512-B4UkaTK3QpgCwJnrxKfMPKdo92CN7OKXAlpAAnM3UPu0Q0lCCk57ylA9AJbRy2v8dDKOPAAWcoR6CMyeoHwRCA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-module-transforms": "^7.29.7", "@babel/helper-plugin-utils": "^7.29.7" @@ -6349,8 +6517,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.7.tgz", "integrity": "sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.29.7", "@babel/helper-plugin-utils": "^7.29.7" @@ -6366,8 +6536,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.29.7.tgz", "integrity": "sha512-fEo41GmsOUhOBlw8ioo6zvjX5Xc2Lqkzlyfqbpsk3eB6TReV18uhxZ0esfEokVbY2+PVJAQHNKxER6lGrzNd3A==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, @@ -6382,8 +6554,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.29.7.tgz", "integrity": "sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, @@ -6398,8 +6572,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.29.7.tgz", "integrity": "sha512-zR7fv/z14OjgHl4AgRtkDBvBMhIzCxqV/qN/2BCRC7LjFwvuzjYe7gDWxC4Wl/SNsLM6SE1IWvRPYMgSJaUvNw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, @@ -6414,8 +6590,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.29.7.tgz", "integrity": "sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-compilation-targets": "^7.29.7", "@babel/helper-plugin-utils": "^7.29.7", @@ -6434,8 +6612,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.29.7.tgz", "integrity": "sha512-Ea/diGcw0twB5IlZPO5sgET6fJsLJqPABqTuFWIR+iMPGPZJkATEIWx0wa+aEQ5UY1CBQyP/gkAiLEqn1vBiQA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7", "@babel/helper-replace-supers": "^7.29.7" @@ -6451,8 +6631,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.29.7.tgz", "integrity": "sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, @@ -6467,8 +6649,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.29.7.tgz", "integrity": "sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" @@ -6484,8 +6668,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.29.7.tgz", "integrity": "sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, @@ -6500,8 +6686,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.29.7.tgz", "integrity": "sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.29.7", "@babel/helper-plugin-utils": "^7.29.7" @@ -6517,8 +6705,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.29.7.tgz", "integrity": "sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.29.7", "@babel/helper-create-class-features-plugin": "^7.29.7", @@ -6535,8 +6725,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.29.7.tgz", "integrity": "sha512-bOMRLQuI0A5ZqHq3OWJ89/rXpJ/NJrbVhXiP4zwPGMs6kpcVsuTUNjwoE30K0Qm3mf48a/TnRYYD6vPNqcg6jA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, @@ -6551,8 +6743,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.29.7.tgz", "integrity": "sha512-+1wdDMGNb4UPeY3Q4L5yLiYe6TXPXubs4NjrgRFw13hPRLJfEMw2Q5OXkee6/IfdqePIeW4Jjwe3aBh7SdKz4Q==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, @@ -6567,8 +6761,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.29.7.tgz", "integrity": "sha512-WsZulLVBUHXVj2cUcPVx6UE21TpalB6bHbSFErKT0Ib++ax24jjXe73FqlWvdylFOjiuPHYi6VCcgRad1ItN+A==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.29.7", "@babel/helper-module-imports": "^7.29.7", @@ -6587,8 +6783,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.29.7.tgz", "integrity": "sha512-Xfy3UVMF04+ypnFbkhvfqtmvwfe92qwQdbGZVonhE+6v35GzlofmOnA1szaZqzb9xYWr0nl1e5EMmzi0DNON1g==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/plugin-transform-react-jsx": "^7.29.7" }, @@ -6603,8 +6801,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.29.7.tgz", "integrity": "sha512-H5E+HBgDpr6Q5t+Aj11tL7XkIui1jhbIoArVQnqjgXo5/3YxkN7ZEBcWF4RQlB0T4rrxJQbXS6kiFV6B7XTqUA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.29.7", "@babel/helper-plugin-utils": "^7.29.7" @@ -6620,8 +6820,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.7.tgz", "integrity": "sha512-rNNFV0DBAJp988xW2DOntfDoYn1eR8GGF5AT5vYc+rjyfaQkM242c9tZUHHPe7KYaiJizXPWhQTzzdbXySyhBw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, @@ -6636,8 +6838,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.29.7.tgz", "integrity": "sha512-mB5Fs0VWrJ42ZCmc8114v60qetdaUVNkj9PmSZRmanCZM3S9hm0CFRLjRmYIsuXav14l2jvZ+4T8iiCGnhj3nQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.29.7", "@babel/helper-plugin-utils": "^7.29.7" @@ -6653,8 +6857,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.29.7.tgz", "integrity": "sha512-5+YhdpVgmfSmwZyLMftfaiffLRMHjzIRHFHHLdibcSyJm2pasMrKHrO3Ptrt2DRshjvpgjEJJ1zVW14WPq/6QA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, @@ -6669,8 +6875,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.7.tgz", "integrity": "sha512-xmAscdE/AsqRW7vutbPNoUmu/nF5SrLKPs7aoJgEjo35lLKA/Bc0i2rMv/hr1+Y0o1bQCiVtith3u2vdgRL39Q==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-module-imports": "^7.29.7", "@babel/helper-plugin-utils": "^7.29.7", @@ -6690,8 +6898,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.29.7.tgz", "integrity": "sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, @@ -6706,8 +6916,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.29.7.tgz", "integrity": "sha512-/u5K1QWada7tbYNqTjMh96718g9NTwh9tfPJMsSmVsQwGT447FskV+KcfeXkXq2GWki4EM/MuTdmBec+hOuVTQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" @@ -6723,8 +6935,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.29.7.tgz", "integrity": "sha512-BCHzNYJGe9l7EpwwDBN/ztlL2NYFFq8hp9ddjtUEM9f2O7S7kKV/lL6Fwo7IF7NSkYhPK2vO+86nIGltA90MsA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, @@ -6739,8 +6953,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.29.7.tgz", "integrity": "sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, @@ -6755,8 +6971,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.29.7.tgz", "integrity": "sha512-223mNGoTkBiTEWFoK+Q6Go3tueMRclO8vxxxxquNCYuNI4jWOofFKJRRDu6SDrB8Sgo1UEGW9T4GAQ8ZyRso1A==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, @@ -6771,8 +6989,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.7.tgz", "integrity": "sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.29.7", "@babel/helper-create-class-features-plugin": "^7.29.7", @@ -6791,8 +7011,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.29.7.tgz", "integrity": "sha512-jCfXxSjf94lf4E0hKE0AByxF6F3/pVFqRdUUNkDJhsY0m1ZKjnN6ZYyMeHNpzflxb/0q5b7t3p+BE+SLF1WOtA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, @@ -6807,8 +7029,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.29.7.tgz", "integrity": "sha512-OgZ+zoAJgZLUCunsTRQ5LAjOywDv5zzZ2/hQ5aMw1pGXyY2rtE8/chXYUmu3AlVHKpm10KEdG9aMwbI/K76ZGw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.29.7", "@babel/helper-plugin-utils": "^7.29.7" @@ -6824,8 +7048,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.29.7.tgz", "integrity": "sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.29.7", "@babel/helper-plugin-utils": "^7.29.7" @@ -6841,8 +7067,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.29.7.tgz", "integrity": "sha512-BLOhLht9DOJwIxlmp91wHvkXv1lguuHS3/FwUO8HL1H0u8s4hR1gASVFyilu9iGtcTRYqjTZmlsFFeQletntEg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.29.7", "@babel/helper-plugin-utils": "^7.29.7" @@ -6858,8 +7086,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.7.tgz", "integrity": "sha512-GYzX36n1nsciIb0uyH0GHwxwtNwPQIcpxSeiVLDtG/B7jB5xXgchnmL1f/jCX5o+pwnaDBtO60ONSJhEBJfxYA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/compat-data": "^7.29.7", "@babel/helper-compilation-targets": "^7.29.7", @@ -6944,8 +7174,10 @@ "version": "0.14.2", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz", "integrity": "sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.8", "core-js-compat": "^3.48.0" @@ -6958,8 +7190,10 @@ "version": "0.1.6-no-external-plugins", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/types": "^7.4.4", @@ -6973,8 +7207,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.29.7.tgz", "integrity": "sha512-C+PV1TFUPTmBQGoPBL8j2QmLpZ117YTCwxIZeJOM96GbYMFSc7/pOXU5lVykwnZxyTqQxRsvoRk6f2FktZgGHA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7", "@babel/helper-validator-option": "^7.29.7", @@ -6994,8 +7230,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.29.7.tgz", "integrity": "sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7", "@babel/helper-validator-option": "^7.29.7", @@ -7014,8 +7252,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.9.0" } @@ -7024,8 +7264,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/parser": "^7.29.7", @@ -7039,8 +7281,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", @@ -7058,8 +7302,10 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" @@ -7072,8 +7318,10 @@ "version": "4.9.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "eslint-visitor-keys": "^3.4.3" }, @@ -7091,8 +7339,10 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "extraneous": true, + "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -7104,8 +7354,10 @@ "version": "4.12.2", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -7114,8 +7366,10 @@ "version": "0.21.2", "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", - "extraneous": true, + "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", @@ -7129,15 +7383,19 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "extraneous": true, - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/@eslint/config-array/node_modules/brace-expansion": { "version": "1.1.15", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -7147,8 +7405,10 @@ "version": "3.1.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "extraneous": true, + "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -7160,8 +7420,10 @@ "version": "0.4.2", "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", - "extraneous": true, + "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@eslint/core": "^0.17.0" }, @@ -7173,8 +7435,10 @@ "version": "0.17.0", "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", - "extraneous": true, + "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@types/json-schema": "^7.0.15" }, @@ -7186,8 +7450,10 @@ "version": "3.3.5", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", @@ -7210,15 +7476,19 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "extraneous": true, - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/@eslint/eslintrc/node_modules/brace-expansion": { "version": "1.1.15", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -7228,8 +7498,10 @@ "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=18" }, @@ -7241,8 +7513,10 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 4" } @@ -7251,8 +7525,10 @@ "version": "3.1.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "extraneous": true, + "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -7264,8 +7540,10 @@ "version": "9.39.4", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -7277,8 +7555,10 @@ "version": "2.1.7", "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", - "extraneous": true, + "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } @@ -7287,8 +7567,10 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", - "extraneous": true, + "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" @@ -7301,8 +7583,10 @@ "version": "0.19.2", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", - "extraneous": true, + "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@humanfs/types": "^0.15.0" }, @@ -7314,8 +7598,10 @@ "version": "0.16.8", "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", - "extraneous": true, + "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@humanfs/core": "^0.19.2", "@humanfs/types": "^0.15.0", @@ -7329,8 +7615,10 @@ "version": "0.15.0", "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", - "extraneous": true, + "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "engines": { "node": ">=18.18.0" } @@ -7339,8 +7627,10 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "extraneous": true, + "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "engines": { "node": ">=12.22" }, @@ -7353,8 +7643,10 @@ "version": "0.4.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "extraneous": true, + "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "engines": { "node": ">=18.18" }, @@ -7367,8 +7659,10 @@ "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" @@ -7378,8 +7672,10 @@ "version": "2.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -7389,8 +7685,10 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.0.0" } @@ -7399,15 +7697,19 @@ "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "extraneous": true, - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -7417,8 +7719,10 @@ "version": "5.1.1-v1", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "eslint-scope": "5.1.1" } @@ -7427,22 +7731,28 @@ "version": "1.0.9", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", - "extraneous": true, - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "extraneous": true, - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/@typescript-eslint/eslint-plugin": { "version": "8.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.62.0.tgz", "integrity": "sha512-o+mpz7EYiMzXoySXiKmzlabIvTVqUuK5yLrAedRPRDA0IpPFMUV1IXt6OqljIxX/kumN6EjUYp41Hqelh6p/Dw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.62.0", @@ -7470,8 +7780,10 @@ "version": "8.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.62.0.tgz", "integrity": "sha512-dzHeT2gySzZtLDsuqxU9AkYgIsQoHAHtRBpOqM+Ofzx1Bwrd2RcCjQJ+6iQbsHOIR6NS33bF2W1k3blN1zLDrA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.62.0", "@typescript-eslint/types": "8.62.0", @@ -7495,8 +7807,10 @@ "version": "8.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.62.0.tgz", "integrity": "sha512-wexnCqiTg7BOGtbLDftYpRWlmLq4xfoMd7BKFR6Y75sZS3QmRKLdN3yWLhmIYgqMmP/OXWpj3H8odkb5nGURCQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.62.0", "@typescript-eslint/types": "^8.62.0", @@ -7517,8 +7831,10 @@ "version": "8.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.62.0.tgz", "integrity": "sha512-1lX38kNxXIRb8mEc3lbq5mdHq1Pf2+U0nFU65KfT18mtPxxl0fvjuEE92mHuXPuCtElJhOrddOpyMlM3Z0umEA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@typescript-eslint/types": "8.62.0", "@typescript-eslint/visitor-keys": "8.62.0" @@ -7535,8 +7851,10 @@ "version": "8.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.62.0.tgz", "integrity": "sha512-y2GAdB6ykaXUvuspbYnizQc4oDDz0Tz/Yc7iWrXf9mx8vm/L/0vLHCe0tS2boG96Zy+DivnVDQ9ZUEWoHqqx1g==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -7552,8 +7870,10 @@ "version": "8.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.62.0.tgz", "integrity": "sha512-+g5O3j0w2ldzC86Pv6fvbO/xhAonbJFIdf/MKQ1d30gndlsVzUOE83ldfSE15Qrl9fhFjK6AovHs5Wpp6vx86w==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@typescript-eslint/types": "8.62.0", "@typescript-eslint/typescript-estree": "8.62.0", @@ -7577,8 +7897,10 @@ "version": "8.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.62.0.tgz", "integrity": "sha512-KvAclkktORPvM54TgLgA4z9HIV1M8zOgw9ZVNXl9f/8dLYfXYX1wkMXP7qmabpijQRV5bHJLOmoyGQbLMaUYeg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -7591,8 +7913,10 @@ "version": "8.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.62.0.tgz", "integrity": "sha512-+hVbNxtW64pIcZWDPGbyaKF7vp2IBTVY5ma1blwwksrjdsbdqqEKvJWMGbBofei4F6Dovx1M0RJgoFeNu2279A==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@typescript-eslint/project-service": "8.62.0", "@typescript-eslint/tsconfig-utils": "8.62.0", @@ -7619,8 +7943,10 @@ "version": "7.8.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "extraneous": true, + "dev": true, "license": "ISC", + "optional": true, + "peer": true, "bin": { "semver": "bin/semver.js" }, @@ -7632,8 +7958,10 @@ "version": "8.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.62.0.tgz", "integrity": "sha512-82r66fi9zYwZ+mTq3vKgwjbZ1PVk/DJzrXFLpG6RnBbdvH8TEGVHIs9H4d2drhkOzf0syZuD/OZvvlu6GDbP4g==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.62.0", @@ -7656,8 +7984,10 @@ "version": "8.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.62.0.tgz", "integrity": "sha512-CY3uyFSRbcQv3nnSv8S0+lDftMVz6P963PoRlxrV7ew/Md564g9ut60PYzdLM5qW4jFn93GBF+Soi90ISAN+GQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@typescript-eslint/types": "8.62.0", "eslint-visitor-keys": "^5.0.0" @@ -7674,8 +8004,10 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "extraneous": true, + "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" }, @@ -7687,8 +8019,10 @@ "version": "8.17.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -7700,8 +8034,10 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -7710,8 +8046,10 @@ "version": "6.15.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -7727,8 +8065,10 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -7743,15 +8083,19 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "extraneous": true, - "license": "Python-2.0" + "dev": true, + "license": "Python-2.0", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/aria-query": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", - "extraneous": true, + "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "engines": { "node": ">= 0.4" } @@ -7760,8 +8104,10 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" @@ -7777,8 +8123,10 @@ "version": "3.1.9", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", @@ -7800,8 +8148,10 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -7821,8 +8171,10 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", @@ -7840,8 +8192,10 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", @@ -7859,8 +8213,10 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -7876,8 +8232,10 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", @@ -7898,15 +8256,19 @@ "version": "0.0.8", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", - "extraneous": true, - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/async-function": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.4" } @@ -7915,8 +8277,10 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "possible-typed-array-names": "^1.0.0" }, @@ -7931,8 +8295,10 @@ "version": "4.12.1", "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.12.1.tgz", "integrity": "sha512-s7iGf5GaVMxEG0ENN9x+xTr7GFZCb1ZP/1uATUpCEK2X78nDB3RwbtFCo9pGAf9ru+VwoQ464DkaLEeRM08wJA==", - "extraneous": true, + "dev": true, "license": "MPL-2.0", + "optional": true, + "peer": true, "engines": { "node": ">=4" } @@ -7941,8 +8307,10 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "extraneous": true, + "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "engines": { "node": ">= 0.4" } @@ -7951,8 +8319,10 @@ "version": "0.2.3", "resolved": "https://registry.npmjs.org/babel-plugin-dev-expression/-/babel-plugin-dev-expression-0.2.3.tgz", "integrity": "sha512-rP5LK9QQTzCW61nVVzw88En1oK8t8gTsIeC6E61oelxNsU842yMjF0G1MxhvUpCkxCEIj7sE8/e5ieTheT//uw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "peerDependencies": { "@babel/core": "^7.0.0" } @@ -7961,8 +8331,10 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "object.assign": "^4.1.0" } @@ -7971,8 +8343,10 @@ "version": "0.4.17", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz", "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/compat-data": "^7.28.6", "@babel/helper-define-polyfill-provider": "^0.6.8", @@ -7986,8 +8360,10 @@ "version": "0.13.0", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.5", "core-js-compat": "^3.43.0" @@ -8000,8 +8376,10 @@ "version": "0.6.8", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz", "integrity": "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.8" }, @@ -8013,15 +8391,19 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==", - "extraneous": true, - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/babel-preset-enact": { "version": "0.1.17", "resolved": "https://registry.npmjs.org/babel-preset-enact/-/babel-preset-enact-0.1.17.tgz", "integrity": "sha512-0x8sc//pDJazXhGvlOD4w8mecFVcUZvuiIi3JLK/1TBYZ7Q4/8jnXjii61OZyyGGwy30QCflf+WTy3A6rQubbg==", - "extraneous": true, + "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@babel/core": "^7.29.7", "@babel/plugin-proposal-decorators": "^7.29.7", @@ -8041,8 +8423,10 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "18 || 20 || >=22" } @@ -8051,8 +8435,10 @@ "version": "2.10.38", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.38.tgz", "integrity": "sha512-31/02mVB4yuQU6adKk5SlY6m+mxDwUq5KZkyYgnLrrKl7TEm1+3PyDtDBz2kOv/wxZz41GHsvV1A/u6RmiyBvw==", - "extraneous": true, + "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "bin": { "baseline-browser-mapping": "dist/cli.cjs" }, @@ -8064,8 +8450,10 @@ "version": "5.0.6", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "balanced-match": "^4.0.2" }, @@ -8077,7 +8465,7 @@ "version": "4.28.4", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.4.tgz", "integrity": "sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==", - "extraneous": true, + "dev": true, "funding": [ { "type": "opencollective", @@ -8093,6 +8481,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.10.38", "caniuse-lite": "^1.0.30001799", @@ -8111,8 +8501,10 @@ "version": "1.0.9", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", @@ -8130,8 +8522,10 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" @@ -8144,8 +8538,10 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" @@ -8161,8 +8557,10 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6" } @@ -8171,7 +8569,7 @@ "version": "1.0.30001799", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz", "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==", - "extraneous": true, + "dev": true, "funding": [ { "type": "opencollective", @@ -8186,14 +8584,18 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "CC-BY-4.0" + "license": "CC-BY-4.0", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8209,8 +8611,10 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "color-name": "~1.1.4" }, @@ -8222,29 +8626,37 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "extraneous": true, - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "extraneous": true, - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "extraneous": true, - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/core-js-compat": { "version": "3.49.0", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.49.0.tgz", "integrity": "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "browserslist": "^4.28.1" }, @@ -8257,8 +8669,10 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -8272,15 +8686,19 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "extraneous": true, - "license": "BSD-2-Clause" + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/data-view-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", @@ -8297,8 +8715,10 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", @@ -8315,8 +8735,10 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -8333,8 +8755,10 @@ "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ms": "^2.1.3" }, @@ -8351,15 +8775,19 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "extraneous": true, - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -8376,8 +8804,10 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", @@ -8394,8 +8824,10 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "extraneous": true, + "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "esutils": "^2.0.2" }, @@ -8407,8 +8839,10 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", @@ -8422,22 +8856,28 @@ "version": "1.5.377", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.377.tgz", "integrity": "sha512-cH1jZgJHoezfTnKfKwnScpHywTFVnJUNITDPREFdhNjiuD502+QFpG0Qk7G8jhsV/f+CEAFlIrzP1fT+IMb92g==", - "extraneous": true, - "license": "ISC" + "dev": true, + "license": "ISC", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "extraneous": true, - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/es-abstract": { "version": "1.24.2", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", @@ -8505,8 +8945,10 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-abstract-get/-/es-abstract-get-1.0.0.tgz", "integrity": "sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "es-errors": "^1.3.0", "es-object-atoms": "^1.1.2", @@ -8524,8 +8966,10 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.4" } @@ -8534,8 +8978,10 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.4" } @@ -8544,8 +8990,10 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.3.3.tgz", "integrity": "sha512-0PuBxFi+4uPanB97iDxCLWuHeYud2FALrw5HFZGtAF38UpJDbDC8frwp2cnDyae692CQ0dou60UwWfhgsa4U/g==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bind": "^1.0.9", "call-bound": "^1.0.4", @@ -8572,8 +9020,10 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "es-errors": "^1.3.0" }, @@ -8585,8 +9035,10 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", @@ -8601,8 +9053,10 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "hasown": "^2.0.2" }, @@ -8614,8 +9068,10 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.1.tgz", "integrity": "sha512-CxN9N56HYfd2m/acc/NOFrZQsN9kU4eh+2kk6A707Kz1krH8tKmfrs5RnftB8WNX80T0NS7vSQsDOlg23diR2g==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "es-abstract-get": "^1.0.0", "es-errors": "^1.3.0", @@ -8634,8 +9090,10 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6" } @@ -8644,8 +9102,10 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -8657,8 +9117,10 @@ "version": "9.39.4", "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -8717,8 +9179,10 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/eslint-plugin-enact/-/eslint-plugin-enact-2.0.4.tgz", "integrity": "sha512-BGl2iswi85FUl/fTZ9WEQq+M6oHzcP4YjK4eCxaISeO/BIMjYenp76QHzKFNG20GFjeaK5Eo/Rpah7DhSkDLeQ==", - "extraneous": true, + "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "doctrine": "^3.0.0", "jsx-ast-utils": "^3.3.5", @@ -8735,8 +9199,10 @@ "version": "29.15.2", "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-29.15.2.tgz", "integrity": "sha512-kEN4r9RZl1xcsb4arGq89LrcVdOUFII/JSCwtTPJyv16mDwmPrcuEQwpxqZHeINvcsd7oK5O/rhdGlxFRaZwvQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@typescript-eslint/utils": "^8.0.0" }, @@ -8765,8 +9231,10 @@ "version": "6.10.2", "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "aria-query": "^5.3.2", "array-includes": "^3.1.8", @@ -8795,15 +9263,19 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "extraneous": true, - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": { "version": "1.1.15", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -8813,8 +9285,10 @@ "version": "3.1.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "extraneous": true, + "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -8826,8 +9300,10 @@ "version": "7.37.5", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", @@ -8859,8 +9335,10 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/core": "^7.24.4", "@babel/parser": "^7.24.4", @@ -8879,15 +9357,19 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "extraneous": true, - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/eslint-plugin-react/node_modules/brace-expansion": { "version": "1.1.15", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -8897,8 +9379,10 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "extraneous": true, + "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "esutils": "^2.0.2" }, @@ -8910,8 +9394,10 @@ "version": "3.1.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "extraneous": true, + "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -8923,8 +9409,10 @@ "version": "2.0.0-next.7", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.7.tgz", "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.2", @@ -8947,8 +9435,10 @@ "version": "7.16.2", "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-7.16.2.tgz", "integrity": "sha512-8gleGnQXK2ZA3hHwjCwpYTZvM+9VsrJ+/9kDI8CjqAQGAdMQOdn/rJNu7ZySENuiWlGKQWyZJ4ZjEg2zamaRHw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "^8.56.0", "@typescript-eslint/utils": "^8.56.0" @@ -8964,8 +9454,10 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=4.0.0" } @@ -8974,8 +9466,10 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "extraneous": true, + "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -8988,8 +9482,10 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "extraneous": true, + "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "engines": { "node": ">=4.0" } @@ -8998,8 +9494,10 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "extraneous": true, + "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "engines": { "node": ">=10" } @@ -9008,15 +9506,19 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "extraneous": true, - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.15", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -9026,8 +9528,10 @@ "version": "8.4.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", - "extraneous": true, + "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -9043,8 +9547,10 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "extraneous": true, + "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -9056,8 +9562,10 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 4" } @@ -9066,8 +9574,10 @@ "version": "3.1.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "extraneous": true, + "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -9079,8 +9589,10 @@ "version": "10.4.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "extraneous": true, + "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", @@ -9097,8 +9609,10 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "extraneous": true, + "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -9110,8 +9624,10 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", - "extraneous": true, + "dev": true, "license": "BSD-3-Clause", + "optional": true, + "peer": true, "dependencies": { "estraverse": "^5.1.0" }, @@ -9123,8 +9639,10 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "extraneous": true, + "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "dependencies": { "estraverse": "^5.2.0" }, @@ -9136,8 +9654,10 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "extraneous": true, + "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "engines": { "node": ">=4.0" } @@ -9146,8 +9666,10 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "extraneous": true, + "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -9156,29 +9678,37 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "extraneous": true, - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "extraneous": true, - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "extraneous": true, - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=12.0.0" }, @@ -9195,8 +9725,10 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "flat-cache": "^4.0.0" }, @@ -9208,8 +9740,10 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -9225,8 +9759,10 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" @@ -9239,15 +9775,19 @@ "version": "3.4.2", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", - "extraneous": true, - "license": "ISC" + "dev": true, + "license": "ISC", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/for-each": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "is-callable": "^1.2.7" }, @@ -9262,8 +9802,10 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -9272,8 +9814,10 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.2.0.tgz", "integrity": "sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bind": "^1.0.9", "call-bound": "^1.0.4", @@ -9296,8 +9840,10 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -9306,8 +9852,10 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.4" } @@ -9316,8 +9864,10 @@ "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.9.0" } @@ -9326,8 +9876,10 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", @@ -9351,8 +9903,10 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" @@ -9365,8 +9919,10 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", @@ -9383,8 +9939,10 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "extraneous": true, + "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "is-glob": "^4.0.3" }, @@ -9396,8 +9954,10 @@ "version": "17.7.0", "resolved": "https://registry.npmjs.org/globals/-/globals-17.7.0.tgz", "integrity": "sha512-Czmyns5dUsq4seFBR/Kdydhmo8y9kC79hiSkPn0YcGtNnYWnrgt0vjrSjx9tspoDGWm2CMarffRuLjM4xUz8xg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=18" }, @@ -9409,8 +9969,10 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" @@ -9426,8 +9988,10 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.4" }, @@ -9439,8 +10003,10 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.4" }, @@ -9452,8 +10018,10 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=8" } @@ -9462,8 +10030,10 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "es-define-property": "^1.0.0" }, @@ -9475,8 +10045,10 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "dunder-proto": "^1.0.0" }, @@ -9491,8 +10063,10 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.4" }, @@ -9504,8 +10078,10 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "has-symbols": "^1.0.3" }, @@ -9520,8 +10096,10 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -9533,15 +10111,19 @@ "version": "0.25.1", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", - "extraneous": true, - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/hermes-parser": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "hermes-estree": "0.25.1" } @@ -9550,8 +10132,10 @@ "version": "7.0.5", "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 4" } @@ -9560,8 +10144,10 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -9577,8 +10163,10 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.8.19" } @@ -9587,8 +10175,10 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", @@ -9602,8 +10192,10 @@ "version": "3.0.5", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", @@ -9620,8 +10212,10 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "async-function": "^1.0.0", "call-bound": "^1.0.3", @@ -9640,8 +10234,10 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "has-bigints": "^1.0.2" }, @@ -9656,8 +10252,10 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" @@ -9673,8 +10271,10 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.4" }, @@ -9686,8 +10286,10 @@ "version": "2.16.2", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "hasown": "^2.0.3" }, @@ -9702,8 +10304,10 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", @@ -9720,8 +10324,10 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" @@ -9737,8 +10343,10 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-document.all/-/is-document.all-1.0.0.tgz", "integrity": "sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bound": "^1.0.4" }, @@ -9753,8 +10361,10 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -9763,8 +10373,10 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bound": "^1.0.3" }, @@ -9779,8 +10391,10 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bound": "^1.0.4", "generator-function": "^2.0.0", @@ -9799,8 +10413,10 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -9812,8 +10428,10 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.4" }, @@ -9825,8 +10443,10 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.4" }, @@ -9838,8 +10458,10 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" @@ -9855,8 +10477,10 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", @@ -9874,8 +10498,10 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.4" }, @@ -9887,8 +10513,10 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bound": "^1.0.3" }, @@ -9903,8 +10531,10 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" @@ -9920,8 +10550,10 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bound": "^1.0.2", "has-symbols": "^1.1.0", @@ -9938,8 +10570,10 @@ "version": "1.1.15", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "which-typed-array": "^1.1.16" }, @@ -9954,8 +10588,10 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.4" }, @@ -9967,8 +10603,10 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bound": "^1.0.3" }, @@ -9983,8 +10621,10 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" @@ -10000,22 +10640,28 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "extraneous": true, - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "extraneous": true, - "license": "ISC" + "dev": true, + "license": "ISC", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/iterator.prototype": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "define-data-property": "^1.1.4", "es-object-atoms": "^1.0.0", @@ -10032,14 +10678,16 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "extraneous": true, - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/js-yaml": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", - "extraneous": true, + "dev": true, "funding": [ { "type": "github", @@ -10051,6 +10699,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "argparse": "^2.0.1" }, @@ -10062,8 +10712,10 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "bin": { "jsesc": "bin/jsesc" }, @@ -10075,29 +10727,37 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "extraneous": true, - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "extraneous": true, - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "extraneous": true, - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "bin": { "json5": "lib/cli.js" }, @@ -10109,8 +10769,10 @@ "version": "3.3.5", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", @@ -10125,8 +10787,10 @@ "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "json-buffer": "3.0.1" } @@ -10135,15 +10799,19 @@ "version": "0.3.23", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", - "extraneous": true, - "license": "CC0-1.0" + "dev": true, + "license": "CC0-1.0", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/language-tags": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "language-subtag-registry": "^0.3.20" }, @@ -10155,8 +10823,10 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -10169,8 +10839,10 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -10185,22 +10857,28 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "extraneous": true, - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "extraneous": true, - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -10212,8 +10890,10 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "extraneous": true, + "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "yallist": "^3.0.2" } @@ -10222,8 +10902,10 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.4" } @@ -10232,8 +10914,10 @@ "version": "10.2.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "extraneous": true, + "dev": true, "license": "BlueOak-1.0.0", + "optional": true, + "peer": true, "dependencies": { "brace-expansion": "^5.0.5" }, @@ -10248,22 +10932,28 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "extraneous": true, - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "extraneous": true, - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/node-exports-info": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.2.tgz", "integrity": "sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "array.prototype.flatmap": "^1.3.3", "es-errors": "^1.3.0", @@ -10281,8 +10971,10 @@ "version": "2.0.48", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.48.tgz", "integrity": "sha512-1uz8041X6LoI6ZSdZacM9lVY28vuzDlSKitnpbSNK0RfKoIJkX29NBPVEFXhnuSuEOA9Ww0xnPJ+ILWbGAv8DA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=18" } @@ -10291,8 +10983,10 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -10301,8 +10995,10 @@ "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.4" }, @@ -10314,8 +11010,10 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.4" } @@ -10324,8 +11022,10 @@ "version": "4.1.7", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", @@ -10345,8 +11045,10 @@ "version": "1.1.9", "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", @@ -10361,8 +11063,10 @@ "version": "2.0.8", "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -10380,8 +11084,10 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", @@ -10399,8 +11105,10 @@ "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -10417,8 +11125,10 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", @@ -10435,8 +11145,10 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -10451,8 +11163,10 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -10467,8 +11181,10 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "callsites": "^3.0.0" }, @@ -10480,8 +11196,10 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=8" } @@ -10490,8 +11208,10 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=8" } @@ -10500,22 +11220,28 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "extraneous": true, - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "extraneous": true, - "license": "ISC" + "dev": true, + "license": "ISC", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/picomatch": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=12" }, @@ -10527,8 +11253,10 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.4" } @@ -10537,8 +11265,10 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.8.0" } @@ -10547,8 +11277,10 @@ "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -10559,8 +11291,10 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6" } @@ -10569,8 +11303,10 @@ "version": "19.2.7", "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -10579,15 +11315,19 @@ "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "extraneous": true, - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", @@ -10609,15 +11349,19 @@ "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "extraneous": true, - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/regenerate-unicode-properties": { "version": "10.2.2", "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "regenerate": "^1.4.2" }, @@ -10629,8 +11373,10 @@ "version": "1.5.4", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", @@ -10650,8 +11396,10 @@ "version": "6.4.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.2.2", @@ -10668,15 +11416,19 @@ "version": "0.8.0", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", - "extraneous": true, - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/regjsparser": { "version": "0.13.2", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.2.tgz", "integrity": "sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ==", - "extraneous": true, + "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "dependencies": { "jsesc": "~3.1.0" }, @@ -10688,8 +11440,10 @@ "version": "1.22.12", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.1", @@ -10710,8 +11464,10 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=4" } @@ -10720,8 +11476,10 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bind": "^1.0.9", "call-bound": "^1.0.4", @@ -10740,8 +11498,10 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "es-errors": "^1.3.0", "isarray": "^2.0.5" @@ -10757,8 +11517,10 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -10775,8 +11537,10 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "extraneous": true, + "dev": true, "license": "ISC", + "optional": true, + "peer": true, "bin": { "semver": "bin/semver.js" } @@ -10785,8 +11549,10 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -10803,8 +11569,10 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -10819,8 +11587,10 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "dunder-proto": "^1.0.1", "es-errors": "^1.3.0", @@ -10834,8 +11604,10 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -10847,8 +11619,10 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=8" } @@ -10857,8 +11631,10 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.4", @@ -10877,8 +11653,10 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.4" @@ -10894,8 +11672,10 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -10913,8 +11693,10 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -10933,8 +11715,10 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "es-errors": "^1.3.0", "internal-slot": "^1.1.0" @@ -10947,8 +11731,10 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -10962,8 +11748,10 @@ "version": "4.0.12", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", @@ -10990,8 +11778,10 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" @@ -11001,8 +11791,10 @@ "version": "1.2.11", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz", "integrity": "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bind": "^1.0.9", "call-bound": "^1.0.4", @@ -11024,8 +11816,10 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz", "integrity": "sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bind": "^1.0.9", "call-bound": "^1.0.4", @@ -11043,8 +11837,10 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -11061,8 +11857,10 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=8" }, @@ -11074,8 +11872,10 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -11087,8 +11887,10 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.4" }, @@ -11100,8 +11902,10 @@ "version": "0.2.17", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" @@ -11117,8 +11921,10 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=18.12" }, @@ -11130,8 +11936,10 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "prelude-ls": "^1.2.1" }, @@ -11143,8 +11951,10 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", @@ -11158,8 +11968,10 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bind": "^1.0.8", "for-each": "^0.3.3", @@ -11178,8 +11990,10 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", @@ -11200,8 +12014,10 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.8.tgz", "integrity": "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bind": "^1.0.9", "for-each": "^0.3.5", @@ -11221,8 +12037,10 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", - "extraneous": true, + "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -11235,8 +12053,10 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", @@ -11254,8 +12074,10 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=4" } @@ -11264,8 +12086,10 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" @@ -11278,8 +12102,10 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=4" } @@ -11288,8 +12114,10 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=4" } @@ -11298,7 +12126,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", - "extraneous": true, + "dev": true, "funding": [ { "type": "opencollective", @@ -11314,6 +12142,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" @@ -11329,8 +12159,10 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "extraneous": true, + "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "dependencies": { "punycode": "^2.1.0" } @@ -11339,8 +12171,10 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "extraneous": true, + "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "isexe": "^2.0.0" }, @@ -11355,8 +12189,10 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", @@ -11375,8 +12211,10 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", @@ -11403,8 +12241,10 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", @@ -11422,8 +12262,10 @@ "version": "1.1.22", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.9", @@ -11444,8 +12286,10 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -11454,15 +12298,19 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "extraneous": true, - "license": "ISC" + "dev": true, + "license": "ISC", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/eslint-config-enact/node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -11474,8 +12322,10 @@ "version": "4.4.3", "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } @@ -11484,8 +12334,10 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", - "extraneous": true, + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=18.0.0" }, @@ -11753,8 +12605,9 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "extraneous": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "dependencies": { "estraverse": "^5.2.0" }, @@ -11766,8 +12619,9 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "extraneous": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "engines": { "node": ">=4.0" } @@ -11786,8 +12640,9 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.8.x" } @@ -11796,8 +12651,9 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "extraneous": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/fast-diff": { "version": "1.3.0", @@ -11852,7 +12708,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", - "extraneous": true, "funding": [ { "type": "github", @@ -11863,7 +12718,9 @@ "url": "https://opencollective.com/fastify" } ], - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/fastq": { "version": "1.20.1", @@ -12135,8 +12992,9 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "extraneous": true, - "license": "BSD-2-Clause" + "license": "BSD-2-Clause", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/globals": { "version": "17.7.0", @@ -12204,8 +13062,9 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=8" } @@ -12284,8 +13143,9 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "bin": { "he": "bin/he" } @@ -12300,8 +13160,9 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "camel-case": "^4.1.2", "clean-css": "^5.2.2", @@ -12322,8 +13183,9 @@ "version": "5.6.7", "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.7.tgz", "integrity": "sha512-md+vXtdCAe60s1k6AU3dUyMJnDxUyQAwfwPKoLisvgUF1IXjtlLsk2se54+qfL9Mdm26bbwvjJybpNx48NKRLw==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/html-minifier-terser": "^6.0.0", "html-minifier-terser": "^6.0.2", @@ -12355,7 +13217,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "extraneous": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -12364,6 +13225,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.0.0", @@ -12844,8 +13707,9 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -12946,8 +13810,9 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.2.tgz", "integrity": "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.11.5" }, @@ -12985,8 +13850,9 @@ "version": "4.18.1", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", - "extraneous": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/lodash.merge": { "version": "4.6.2", @@ -13011,8 +13877,9 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "tslib": "^2.0.3" } @@ -13031,8 +13898,9 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "extraneous": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/merge2": { "version": "1.4.1", @@ -13060,8 +13928,9 @@ "version": "1.54.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.6" } @@ -13129,15 +13998,17 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "extraneous": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" @@ -13207,8 +14078,9 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "extraneous": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "dependencies": { "boolbase": "^1.0.0" }, @@ -13419,8 +14291,9 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" @@ -13442,8 +14315,9 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" @@ -13561,8 +14435,9 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "lodash": "^4.17.20", "renderkid": "^3.0.0" @@ -13665,8 +14540,9 @@ "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.10" } @@ -13681,8 +14557,9 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "css-select": "^4.1.3", "dom-converter": "^0.2.0", @@ -13695,8 +14572,9 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -13823,8 +14701,9 @@ "version": "4.3.3", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -13843,8 +14722,9 @@ "version": "8.20.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -13860,8 +14740,9 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -13873,8 +14754,9 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "extraneous": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/semver": { "version": "6.3.1", @@ -14058,8 +14940,9 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "extraneous": true, "license": "BSD-3-Clause", + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -14068,8 +14951,9 @@ "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -14153,8 +15037,9 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -14189,8 +15074,9 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -14246,8 +15132,9 @@ "version": "5.48.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.48.0.tgz", "integrity": "sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==", - "extraneous": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", @@ -14265,8 +15152,9 @@ "version": "5.6.1", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.6.1.tgz", "integrity": "sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", @@ -14326,8 +15214,9 @@ "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "extraneous": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/to-regex-range": { "version": "5.0.1", @@ -14373,8 +15262,9 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "extraneous": true, - "license": "0BSD" + "license": "0BSD", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/type-check": { "version": "0.4.0", @@ -14516,8 +15406,9 @@ "version": "8.3.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", - "extraneous": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/update-browserslist-db": { "version": "1.2.3", @@ -14563,15 +15454,17 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "extraneous": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@enact/dev-utils/node_modules/watchpack": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.2.tgz", "integrity": "sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "graceful-fs": "^4.1.2" }, @@ -14589,8 +15482,9 @@ "version": "5.107.2", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.107.2.tgz", "integrity": "sha512-v7RhXaJbpMlV0D7hC7lb2EbnxkoeUqf9qhKr6lozx3Q48pmFrqqNRmZFUEGmi7pSwm6fCQ2H1IjvCkHqdpVdjQ==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/estree": "^1.0.8", "@types/json-schema": "^7.0.15", @@ -14690,8 +15584,9 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "extraneous": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -14704,8 +15599,9 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "extraneous": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "engines": { "node": ">=4.0" } @@ -17106,6 +18002,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", "license": "MIT", + "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" @@ -17127,421 +18024,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@jsonjoy.com/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/buffers": { - "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-17.67.0.tgz", - "integrity": "sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/codegen": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", - "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-core": { - "version": "4.58.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-core/-/fs-core-4.58.0.tgz", - "integrity": "sha512-K82t5e9w3NYQeIcw129f0SCH/Rn8m8GKPJBYge4W/sA4hhE5h7I8YQhs2HRpUQyUpi+qk7I9tbp1/b87eCM/PA==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/fs-node-builtins": "4.58.0", - "@jsonjoy.com/fs-node-utils": "4.58.0", - "thingies": "^2.5.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-fsa": { - "version": "4.58.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-fsa/-/fs-fsa-4.58.0.tgz", - "integrity": "sha512-1/FdsxQao9pBo2OJLEfKrujHdVyGxXvDTT7EtNh9fvp3MK42nB+xHh1EJr2L1c0a05eCMyFCYZPID3KjX9EAng==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/fs-core": "4.58.0", - "@jsonjoy.com/fs-node-builtins": "4.58.0", - "@jsonjoy.com/fs-node-utils": "4.58.0", - "thingies": "^2.5.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-node": { - "version": "4.58.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node/-/fs-node-4.58.0.tgz", - "integrity": "sha512-bOqoLND5b5xyM+1zro63kClBnB05HTIX0RzOSHy4kAjfnec+CTdV742H/nsDmbkDaaDLHMmYqxAw09NQ8yVIrQ==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/fs-core": "4.58.0", - "@jsonjoy.com/fs-node-builtins": "4.58.0", - "@jsonjoy.com/fs-node-utils": "4.58.0", - "@jsonjoy.com/fs-print": "4.58.0", - "@jsonjoy.com/fs-snapshot": "4.58.0", - "glob-to-regex.js": "^1.0.0", - "thingies": "^2.5.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-node-builtins": { - "version": "4.58.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.58.0.tgz", - "integrity": "sha512-M1sAhjR1de4CL7ivQAFYqJRDVE3krwVOmfcAgG5YQJiDWxYfcGDMLUNcx0p/+Rcs31/Inh1m9aUDk/0jfR1T5w==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-node-to-fsa": { - "version": "4.58.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.58.0.tgz", - "integrity": "sha512-erivc39YHoqWY0U8q5IlEcn238AUkIBByMvM0w7OO/FU9hEH3P7oNkPpYWIMpEMncbePk672GiC8ZSwYc2m7fg==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/fs-fsa": "4.58.0", - "@jsonjoy.com/fs-node-builtins": "4.58.0", - "@jsonjoy.com/fs-node-utils": "4.58.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-node-utils": { - "version": "4.58.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.58.0.tgz", - "integrity": "sha512-IrsAFMFBFQXjpS/u3jOY4DMIbRDg94KxzadddDlJv9xodxZ6/Y3ji91uMwrRqklyu+KoquO/Vxihf3/QrQiuOA==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/fs-node-builtins": "4.58.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-print": { - "version": "4.58.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-print/-/fs-print-4.58.0.tgz", - "integrity": "sha512-jbAYbeuzPXIzvWOuuFMoQgrWaQU5hBqevloebLaiAimoBYLjrjiLPdOaaLHepWcZzOq/7Us8x2F22YlsTPbwmw==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/fs-node-utils": "4.58.0", - "tree-dump": "^1.1.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-snapshot": { - "version": "4.58.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.58.0.tgz", - "integrity": "sha512-DkozLuMgzfpWZO8o8tSlFJIpUQauG7/sgjH0JrqsbLkmjdoInn/o1W7P9FZQSZlR9lOjDgSXs2MfE/sAUi2JRQ==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/buffers": "^17.65.0", - "@jsonjoy.com/fs-node-utils": "4.58.0", - "@jsonjoy.com/json-pack": "^17.65.0", - "@jsonjoy.com/util": "^17.65.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/base64": { - "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-17.67.0.tgz", - "integrity": "sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/codegen": { - "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-17.67.0.tgz", - "integrity": "sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pack": { - "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-17.67.0.tgz", - "integrity": "sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/base64": "17.67.0", - "@jsonjoy.com/buffers": "17.67.0", - "@jsonjoy.com/codegen": "17.67.0", - "@jsonjoy.com/json-pointer": "17.67.0", - "@jsonjoy.com/util": "17.67.0", - "hyperdyperid": "^1.2.0", - "thingies": "^2.5.0", - "tree-dump": "^1.1.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pointer": { - "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-17.67.0.tgz", - "integrity": "sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/util": "17.67.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/util": { - "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-17.67.0.tgz", - "integrity": "sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/buffers": "17.67.0", - "@jsonjoy.com/codegen": "17.67.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/json-pack": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz", - "integrity": "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/base64": "^1.1.2", - "@jsonjoy.com/buffers": "^1.2.0", - "@jsonjoy.com/codegen": "^1.0.0", - "@jsonjoy.com/json-pointer": "^1.0.2", - "@jsonjoy.com/util": "^1.9.0", - "hyperdyperid": "^1.2.0", - "thingies": "^2.5.0", - "tree-dump": "^1.1.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/json-pack/node_modules/@jsonjoy.com/buffers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", - "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/json-pointer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", - "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/codegen": "^1.0.0", - "@jsonjoy.com/util": "^1.9.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/util": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", - "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/buffers": "^1.0.0", - "@jsonjoy.com/codegen": "^1.0.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/util/node_modules/@jsonjoy.com/buffers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", - "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", - "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", - "license": "MIT" - }, "node_modules/@napi-rs/wasm-runtime": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", @@ -17560,18 +18042,6 @@ "@emnapi/runtime": "^1.7.1" } }, - "node_modules/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -17607,161 +18077,508 @@ "node": ">= 8" } }, - "node_modules/@peculiar/asn1-cms": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.8.0.tgz", - "integrity": "sha512-NgekZOrSJFSBFLFoLfwePguAWAx7z1+f2TEsWFUMyiqqfntZ4+S/S5hzqME3q4pCA0iOsFKdwiQ35dwY24eVqA==", + "node_modules/@oven/bun-darwin-aarch64": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@oven/bun-darwin-aarch64/-/bun-darwin-aarch64-1.3.14.tgz", + "integrity": "sha512-Omj20SuiHBOUjUBIyqtkNjSUIjOtEOJwmbix/ZyFH4BaQ6OZTaaRWIR4TjHVz0yadHgli6lLTiAh1uarnvD49A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@oven/bun-darwin-x64": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@oven/bun-darwin-x64/-/bun-darwin-x64-1.3.14.tgz", + "integrity": "sha512-FFj3QdU/OhlDyZOJ8CWfN5eWLpRlT4qjZg7lMQi7jA6GuoY5ajlO1zWLP/MuHYRSbXQUvV52RejNi8DVnAp13w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@oven/bun-darwin-x64-baseline": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@oven/bun-darwin-x64-baseline/-/bun-darwin-x64-baseline-1.3.14.tgz", + "integrity": "sha512-OSfsTZstc898HHElhU4NccaBGOSSDn5VfahiVTnidZ9B/+wb7WTyfZJaBeJcfjwJ9H2W9uTh2TGtl3UfcXgV9g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@oven/bun-freebsd-aarch64": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@oven/bun-freebsd-aarch64/-/bun-freebsd-aarch64-1.3.14.tgz", + "integrity": "sha512-LIKrXaFxAHybVO5Pf+9XP2FHUj/5APvXTUKk9dqHm5iFz4oH+W24cmhjkJirNujh9hKeTyrpWSe3no9JZKowIw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@oven/bun-freebsd-x64": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@oven/bun-freebsd-x64/-/bun-freebsd-x64-1.3.14.tgz", + "integrity": "sha512-uwD+fGUH1ADpIF3B1U2jWzzb20QwRLZfj5QZ28GUCGrAJ/nTmWrD6YYGsblCY1wuhldRez3lU40AyuvSCyLYmw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@oven/bun-linux-aarch64": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@oven/bun-linux-aarch64/-/bun-linux-aarch64-1.3.14.tgz", + "integrity": "sha512-X5SsPZHs+iYO8R/efIcRtc7gT2Q2DgPfliCxEkx4cXBumwkw0c/EsHMNwH3EgGpCDaZ7IYVPhpCG/xBOQHEwZw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oven/bun-linux-aarch64-android": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@oven/bun-linux-aarch64-android/-/bun-linux-aarch64-android-1.3.14.tgz", + "integrity": "sha512-y4kq5b85lsrmFb9Xvi4w9mA5IEFJkLMrSmYn06q24KjL9rUWDWO3VFZEtteZxUN5+ec3Zm5S8OnJw1umaCbVjA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@oven/bun-linux-aarch64-musl": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@oven/bun-linux-aarch64-musl/-/bun-linux-aarch64-musl-1.3.14.tgz", + "integrity": "sha512-jmqOA92Cd1NL/1XBd4bFkJLxQ86K0RW7ohxS2qzzAvuitO4JiIxjjTeCspoU44zCozH72HpfZfUE2On31OjnWA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oven/bun-linux-x64": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@oven/bun-linux-x64/-/bun-linux-x64-1.3.14.tgz", + "integrity": "sha512-7OVTAKvwfPmSbIV1HpdOoVVx5VRc427GuPPne93N6vk4eQBPId9nXmZDh9/zGaKPdbVjVtQSZafWQoUjx38Utw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oven/bun-linux-x64-android": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@oven/bun-linux-x64-android/-/bun-linux-x64-android-1.3.14.tgz", + "integrity": "sha512-qe9e1d+3VAEU7nAA2ol9Jvmy/o99PVMSgZhHn7Q/9O3YcDrfEqyQ8zm4zoe5qTEo8HZH0dN03Le0Ys2eQPs7eg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@oven/bun-linux-x64-baseline": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@oven/bun-linux-x64-baseline/-/bun-linux-x64-baseline-1.3.14.tgz", + "integrity": "sha512-q/8EdOC0yUE8FPeoOVq8/Pw5I9/tJaYmUfO/uDUAREx8IUnOJH1RJ5A3BjFqre8pvJoiZA9AovPJq5FnNNjSxA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oven/bun-linux-x64-musl": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@oven/bun-linux-x64-musl/-/bun-linux-x64-musl-1.3.14.tgz", + "integrity": "sha512-GBCB/k/sIqcr06eTNgg7g46qiUv35Jasx4XiccJ/n7RGqrE4RWUD/XJBbWFprVPjvqd59+QtSnS99XGqvftHfg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oven/bun-linux-x64-musl-baseline": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@oven/bun-linux-x64-musl-baseline/-/bun-linux-x64-musl-baseline-1.3.14.tgz", + "integrity": "sha512-n6iE71G4lQE4XkrZhQQcL5YUlxDbnq6nqV7zeQi33PMsLT/0kYE+RvHOtBWZ3w0wMdXZfINmp63hIb9ijUBGtw==", + "cpu": [ + "x64" + ], "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oven/bun-windows-aarch64": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@oven/bun-windows-aarch64/-/bun-windows-aarch64-1.3.14.tgz", + "integrity": "sha512-T7s3x/BsVKQObGU6QDkZeI6wKynzqGbBH1yI77jrrj5siElclxr3DQrDIk8CV4G5/SJq2HHq4kpLyYY2DKCSmA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@oven/bun-windows-x64": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@oven/bun-windows-x64/-/bun-windows-x64-1.3.14.tgz", + "integrity": "sha512-mUFWL3BoYkNpjd8e9PqROiFF/1Xeotq20mABJsiQH62jM1g5zqWh4khw1RZ6bX8Q8fWvlPaxG1PjofkmjUi3vg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@oven/bun-windows-x64-baseline": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@oven/bun-windows-x64-baseline/-/bun-windows-x64-baseline-1.3.14.tgz", + "integrity": "sha512-uIjLUC1S9DWgICzuoMba7vurBJnBruE4S5CxnvmZkdqWVXRzx1Rgu636HoH+k0qeaQCFh3jeG3JQ1y6fRHv0sw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@parcel/watcher": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz", + "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, "dependencies": { - "@peculiar/asn1-schema": "^2.8.0", - "@peculiar/asn1-x509": "^2.8.0", - "@peculiar/asn1-x509-attr": "^2.8.0", - "asn1js": "^3.0.10", - "tslib": "^2.8.1" + "detect-libc": "^2.0.3", + "is-glob": "^4.0.3", + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.6", + "@parcel/watcher-darwin-arm64": "2.5.6", + "@parcel/watcher-darwin-x64": "2.5.6", + "@parcel/watcher-freebsd-x64": "2.5.6", + "@parcel/watcher-linux-arm-glibc": "2.5.6", + "@parcel/watcher-linux-arm-musl": "2.5.6", + "@parcel/watcher-linux-arm64-glibc": "2.5.6", + "@parcel/watcher-linux-arm64-musl": "2.5.6", + "@parcel/watcher-linux-x64-glibc": "2.5.6", + "@parcel/watcher-linux-x64-musl": "2.5.6", + "@parcel/watcher-win32-arm64": "2.5.6", + "@parcel/watcher-win32-ia32": "2.5.6", + "@parcel/watcher-win32-x64": "2.5.6" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz", + "integrity": "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@peculiar/asn1-csr": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.8.0.tgz", - "integrity": "sha512-akbF8+uvleHs8sejNPQxwmVFuInAg6FMNHOwMILXfP518YfFJwdR3jr6oNUPOaEJfuEhn/vkNOCIT6ASUd4mbg==", + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz", + "integrity": "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.8.0", - "@peculiar/asn1-x509": "^2.8.0", - "asn1js": "^3.0.10", - "tslib": "^2.8.1" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@peculiar/asn1-ecc": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.8.0.tgz", - "integrity": "sha512-ohwlk+u9Rv2NOAY1c6MfHj45ATVF8R1DUN/WCgABiRtLi2ZftlZWZX7KvpAbU8v9xPcmoILfELeEABj/rn18AQ==", + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz", + "integrity": "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.8.0", - "@peculiar/asn1-x509": "^2.8.0", - "asn1js": "^3.0.10", - "tslib": "^2.8.1" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@peculiar/asn1-pfx": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.8.0.tgz", - "integrity": "sha512-5yof1ytoB++RQtaFbqSUJ8pxDJtZT6vbVqZ8XoJ61ph7UjNVvfFwAilnCodqkNsAodpy13gDhoxZXw00pghnyg==", + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz", + "integrity": "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@peculiar/asn1-cms": "^2.8.0", - "@peculiar/asn1-pkcs8": "^2.8.0", - "@peculiar/asn1-rsa": "^2.8.0", - "@peculiar/asn1-schema": "^2.8.0", - "asn1js": "^3.0.10", - "tslib": "^2.8.1" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@peculiar/asn1-pkcs8": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.8.0.tgz", - "integrity": "sha512-qAKXtLpBEw9LqhKpjw3ajZSXlBur+ipW+y2ivVBQAG6F6qRx94yO+1ZR4mvw+YaCfKSaOzLeYEzsPaBp4SJELA==", + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz", + "integrity": "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==", + "cpu": [ + "arm" + ], "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.8.0", - "@peculiar/asn1-x509": "^2.8.0", - "asn1js": "^3.0.10", - "tslib": "^2.8.1" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@peculiar/asn1-pkcs9": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.8.0.tgz", - "integrity": "sha512-b5nDWCnkV60+cQ141D6sVVwK9nz64R5n3zSVnklGd+ECdkW2Ol3U1a6yYFlalpSOaD557yuJB64A+q42jG7lUQ==", + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz", + "integrity": "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==", + "cpu": [ + "arm" + ], "license": "MIT", - "dependencies": { - "@peculiar/asn1-cms": "^2.8.0", - "@peculiar/asn1-pfx": "^2.8.0", - "@peculiar/asn1-pkcs8": "^2.8.0", - "@peculiar/asn1-schema": "^2.8.0", - "@peculiar/asn1-x509": "^2.8.0", - "@peculiar/asn1-x509-attr": "^2.8.0", - "asn1js": "^3.0.10", - "tslib": "^2.8.1" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@peculiar/asn1-rsa": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.8.0.tgz", - "integrity": "sha512-zHEUlCqB2mk7x2lxDwHHJy7hWZOPdGHVlsmITWKB5/PbQo61atbu9PJ/0r9dQNMwFzbKPXZ8uK8/91eUhRznSg==", + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz", + "integrity": "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.8.0", - "@peculiar/asn1-x509": "^2.8.0", - "asn1js": "^3.0.10", - "tslib": "^2.8.1" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@peculiar/asn1-schema": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.8.0.tgz", - "integrity": "sha512-7YT0U/ze0tF2QOBbE15gKZwy5tvgGyLRiRHLzhlbOpf7BT032oBSd0haZqXn5W6l26WLlu3dyxzjM+2638/z2Q==", + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz", + "integrity": "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@peculiar/utils": "^2.0.2", - "asn1js": "^3.0.10", - "tslib": "^2.8.1" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@peculiar/asn1-x509": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.8.0.tgz", - "integrity": "sha512-N0CMuhWUzsWEVq6F1q9X6+VKUnWzSW+cSVg+aPaGGwDdbFoFWTYgin5MHwXgpWd6y9COMBxnfy/Qc+Xc7F0Zwg==", + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz", + "integrity": "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.8.0", - "@peculiar/utils": "^2.0.2", - "asn1js": "^3.0.10", - "tslib": "^2.8.1" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@peculiar/asn1-x509-attr": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.8.0.tgz", - "integrity": "sha512-tHjkfS/qhMnmrlB2J9NhflQlQ7In3khO3CfmVrriOlpTeErY9ZIKOso1hQ5JQiyrJ7ShvqVPk7E5fQmbclkSKA==", + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz", + "integrity": "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.8.0", - "@peculiar/asn1-x509": "^2.8.0", - "asn1js": "^3.0.10", - "tslib": "^2.8.1" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@peculiar/utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@peculiar/utils/-/utils-2.0.3.tgz", - "integrity": "sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ==", + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz", + "integrity": "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "tslib": "^2.8.1" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@peculiar/x509": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.14.3.tgz", - "integrity": "sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==", + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz", + "integrity": "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==", + "cpu": [ + "ia32" + ], "license": "MIT", - "dependencies": { - "@peculiar/asn1-cms": "^2.6.0", - "@peculiar/asn1-csr": "^2.6.0", - "@peculiar/asn1-ecc": "^2.6.0", - "@peculiar/asn1-pkcs9": "^2.6.0", - "@peculiar/asn1-rsa": "^2.6.0", - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "pvtsutils": "^1.3.6", - "reflect-metadata": "^0.2.2", - "tslib": "^2.8.1", - "tsyringe": "^4.10.0" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz", + "integrity": "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=20.0.0" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, "node_modules/@pkgjs/parseargs": { @@ -17786,53 +18603,6 @@ "url": "https://opencollective.com/pkgr" } }, - "node_modules/@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.6.2.tgz", - "integrity": "sha512-IhIAD5n4XvGHuL9nAgWfsBR0TdxtjrUWETYKCBHxauYXEv+b+ctEbs9neEgPC7Ecgzv4bpZTBwesAoGDeFymzA==", - "license": "MIT", - "dependencies": { - "anser": "^2.1.1", - "core-js-pure": "^3.23.3", - "error-stack-parser": "^2.0.6", - "html-entities": "^2.1.0", - "schema-utils": "^4.2.0", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "@types/webpack": "5.x", - "react-refresh": ">=0.10.0 <1.0.0", - "sockjs-client": "^1.4.0", - "type-fest": ">=0.17.0 <6.0.0", - "webpack": "^5.0.0", - "webpack-dev-server": "^4.8.0 || 5.x", - "webpack-hot-middleware": "2.x", - "webpack-plugin-serve": "1.x" - }, - "peerDependenciesMeta": { - "@types/webpack": { - "optional": true - }, - "sockjs-client": { - "optional": true - }, - "type-fest": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - }, - "webpack-hot-middleware": { - "optional": true - }, - "webpack-plugin-serve": { - "optional": true - } - } - }, "node_modules/@rtsao/scc": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", @@ -18016,49 +18786,14 @@ "@babel/types": "^7.28.2" } }, - "node_modules/@types/body-parser": { - "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", - "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", - "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", - "license": "MIT", - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, "node_modules/@types/eslint": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -18070,51 +18805,6 @@ "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", "license": "MIT" }, - "node_modules/@types/express": { - "version": "4.17.25", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", - "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "^1" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.19.8", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz", - "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "license": "MIT" - }, - "node_modules/@types/http-errors": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", - "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", - "license": "MIT" - }, - "node_modules/@types/http-proxy": { - "version": "1.17.17", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.17.tgz", - "integrity": "sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", @@ -18163,12 +18853,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "license": "MIT" - }, "node_modules/@types/node": { "version": "26.1.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.0.tgz", @@ -18184,72 +18868,6 @@ "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", "license": "MIT" }, - "node_modules/@types/qs": { - "version": "6.15.1", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.1.tgz", - "integrity": "sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==", - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "license": "MIT" - }, - "node_modules/@types/retry": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", - "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", - "license": "MIT" - }, - "node_modules/@types/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", - "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/serve-index": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", - "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", - "license": "MIT", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", - "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "<1" - } - }, - "node_modules/@types/serve-static/node_modules/@types/send": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", - "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", - "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/sockjs": { - "version": "0.3.36", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", - "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", @@ -18262,15 +18880,6 @@ "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", "license": "MIT" }, - "node_modules/@types/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/yargs": { "version": "17.0.35", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", @@ -18390,9 +18999,6 @@ "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -18406,9 +19012,6 @@ "cpu": [ "arm64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -18422,9 +19025,6 @@ "cpu": [ "loong64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -18438,9 +19038,6 @@ "cpu": [ "loong64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -18454,9 +19051,6 @@ "cpu": [ "ppc64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -18470,9 +19064,6 @@ "cpu": [ "riscv64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -18486,9 +19077,6 @@ "cpu": [ "riscv64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -18502,9 +19090,6 @@ "cpu": [ "s390x" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -18518,9 +19103,6 @@ "cpu": [ "x64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -18534,9 +19116,6 @@ "cpu": [ "x64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -18618,6 +19197,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "license": "MIT", + "peer": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2" @@ -18627,25 +19207,29 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "license": "MIT", + "peer": true, "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.13.2", "@webassemblyjs/helper-api-error": "1.13.2", @@ -18656,13 +19240,15 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "license": "MIT", + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -18675,6 +19261,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "license": "MIT", + "peer": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -18684,6 +19271,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@xtuc/long": "4.2.2" } @@ -18692,13 +19280,15 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "license": "MIT", + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -18715,6 +19305,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "license": "MIT", + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", @@ -18728,6 +19319,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "license": "MIT", + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -18740,6 +19332,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "license": "MIT", + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-api-error": "1.13.2", @@ -18754,6 +19347,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "license": "MIT", + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" @@ -18763,13 +19357,15 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "peer": true }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/abab": { "version": "2.0.6", @@ -18784,40 +19380,6 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "license": "ISC" }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/acorn": { "version": "8.17.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", @@ -18845,6 +19407,7 @@ "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=10.13.0" }, @@ -18915,6 +19478,7 @@ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "license": "MIT", + "peer": true, "dependencies": { "ajv": "^8.0.0" }, @@ -18932,6 +19496,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -18947,7 +19512,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/ajv-keywords": { "version": "3.5.2", @@ -18958,12 +19524,6 @@ "ajv": "^6.9.1" } }, - "node_modules/anser": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/anser/-/anser-2.3.5.tgz", - "integrity": "sha512-vcZjxvvVoxTeR5XBNJB38oTu/7eDCZlwdz32N1eNgpyPF7j/Z7Idf+CUwQOkKKpJ7RJyjxgLHCM7vdIK0iCNMQ==", - "license": "MIT" - }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -18979,18 +19539,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "engines": [ - "node >= 0.8.0" - ], - "license": "Apache-2.0", - "bin": { - "ansi-html": "bin/ansi-html" - } - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -19081,12 +19629,6 @@ "node": ">=0.10.0" } }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "license": "MIT" - }, "node_modules/array-includes": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", @@ -19207,50 +19749,6 @@ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "license": "MIT" }, - "node_modules/asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.4", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.4.tgz", - "integrity": "sha512-njR1b+ixG2ufvL9Zn9JGneW+b5GV6jqpYyPPpg4QVt723b5kJPGUczkUyWEH9BwEA74UakJZ43I4FDLBF7ci0g==", - "license": "MIT" - }, - "node_modules/asn1js": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.10.tgz", - "integrity": "sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==", - "license": "BSD-3-Clause", - "dependencies": { - "pvtsutils": "^1.3.6", - "pvutils": "^1.1.5", - "tslib": "^2.8.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/assert": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", - "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "is-nan": "^1.3.2", - "object-is": "^1.1.5", - "object.assign": "^4.1.4", - "util": "^0.12.5" - } - }, "node_modules/async-function": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", @@ -19316,6 +19814,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" @@ -19379,31 +19878,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/babel-loader": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-10.1.1.tgz", - "integrity": "sha512-JwKSzk2kjIe7mgPK+/lyZ2QAaJcpahNAdM+hgR2HI8D0OJVkdj8Rl6J3kaLYki9pwF7P2iWnD8qVv80Lq1ABtg==", - "license": "MIT", - "dependencies": { - "find-up": "^5.0.0" - }, - "engines": { - "node": "^18.20.0 || ^20.10.0 || >=22.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0 || ^8.0.0-beta.1", - "@rspack/core": "^1.0.0 || ^2.0.0-0", - "webpack": ">=5.61.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, "node_modules/babel-plugin-dev-expression": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/babel-plugin-dev-expression/-/babel-plugin-dev-expression-0.2.3.tgz", @@ -19581,26 +20055,6 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/baseline-browser-mapping": { "version": "2.10.42", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.42.tgz", @@ -19613,21 +20067,6 @@ "node": ">=6.0.0" } }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "license": "MIT" - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -19640,79 +20079,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/bn.js": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.4.tgz", - "integrity": "sha512-QL7sb18rJ1PbdsKsqPA0guxL563vIMwRHgzNrW/uzQuRGN1Cjqd/wonUBAVqHox9KwzHA6vCbM0lXx3k4iQMow==", - "license": "MIT" - }, - "node_modules/body-parser": { - "version": "1.20.5", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz", - "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==", - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "~1.2.0", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "on-finished": "~2.4.1", - "qs": "~6.15.1", - "raw-body": "~2.5.3", - "type-is": "~1.6.18", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/bonjour-service": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.4.2.tgz", - "integrity": "sha512-lMskhnsW70yWHr4PhPeh2rvaIkLSaDpp+nmtbXBZaNKTXwxL73QOkW6HhbzqTImXjevn9TreGT4GACGBCGP9nQ==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "license": "ISC" - }, "node_modules/brace-expansion": { "version": "1.1.15", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", @@ -19735,134 +20101,6 @@ "node": ">=8" } }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "license": "MIT" - }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "license": "MIT", - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "license": "MIT", - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/browserify-rsa": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.1.tgz", - "integrity": "sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==", - "license": "MIT", - "dependencies": { - "bn.js": "^5.2.1", - "randombytes": "^2.1.0", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/browserify-sign": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.6.tgz", - "integrity": "sha512-sd+Q65fjlWCYWtZKXiKfrUc8d+4jtp/8f0W2NkwzLtoW4bI6UDnWusLWIurHnmurW0XShIRxpwiOX4EoPtXUAg==", - "license": "ISC", - "dependencies": { - "bn.js": "^5.2.3", - "browserify-rsa": "^4.1.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.6.1", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.9", - "readable-stream": "^2.3.8", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/browserify-sign/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/browserify-sign/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/browserify-sign/node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/browserify-sign/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/browserify-sign/node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "license": "MIT", - "dependencies": { - "pako": "~1.0.5" - } - }, "node_modules/browserslist": { "version": "4.28.5", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.5.tgz", @@ -19905,79 +20143,50 @@ "node-int64": "^0.4.0" } }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "license": "MIT" }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", - "license": "MIT" - }, - "node_modules/builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", - "license": "MIT" - }, - "node_modules/bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "node_modules/bun": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/bun/-/bun-1.3.14.tgz", + "integrity": "sha512-aB6GVd42x1Y5ie1K16SF+oLGtgSkwX9hgoDdIW88pjvfTccU8F1vfpoOt34QLv0dZ1v3XimtaxPlZUG81Gx9Zg==", + "cpu": [ + "arm64", + "x64" + ], + "hasInstallScript": true, "license": "MIT", - "dependencies": { - "run-applescript": "^7.0.0" - }, - "engines": { - "node": ">=18" + "os": [ + "darwin", + "linux", + "android", + "freebsd", + "win32" + ], + "bin": { + "bun": "bin/bun.exe", + "bunx": "bin/bunx.exe" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/bytestreamjs": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz", - "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=6.0.0" + "optionalDependencies": { + "@oven/bun-darwin-aarch64": "1.3.14", + "@oven/bun-darwin-x64": "1.3.14", + "@oven/bun-darwin-x64-baseline": "1.3.14", + "@oven/bun-freebsd-aarch64": "1.3.14", + "@oven/bun-freebsd-x64": "1.3.14", + "@oven/bun-linux-aarch64": "1.3.14", + "@oven/bun-linux-aarch64-android": "1.3.14", + "@oven/bun-linux-aarch64-musl": "1.3.14", + "@oven/bun-linux-x64": "1.3.14", + "@oven/bun-linux-x64-android": "1.3.14", + "@oven/bun-linux-x64-baseline": "1.3.14", + "@oven/bun-linux-x64-musl": "1.3.14", + "@oven/bun-linux-x64-musl-baseline": "1.3.14", + "@oven/bun-windows-aarch64": "1.3.14", + "@oven/bun-windows-x64": "1.3.14", + "@oven/bun-windows-x64-baseline": "1.3.14" } }, "node_modules/call-bind": { @@ -20036,16 +20245,6 @@ "node": ">=6" } }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "license": "MIT", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, "node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -20055,18 +20254,6 @@ "node": ">=6" } }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, "node_modules/caniuse-lite": { "version": "1.0.30001803", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001803.tgz", @@ -20087,15 +20274,6 @@ ], "license": "CC-BY-4.0" }, - "node_modules/case-sensitive-paths-webpack-plugin": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", - "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/chalk": { "version": "5.6.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", @@ -20167,6 +20345,7 @@ "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=6.0" } @@ -20186,47 +20365,12 @@ "node": ">=8" } }, - "node_modules/cipher-base": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.7.tgz", - "integrity": "sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.2" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/cjs-module-lexer": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==", "license": "MIT" }, - "node_modules/clean-css": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", - "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", - "license": "MIT", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "node_modules/clean-css/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -20287,12 +20431,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "license": "MIT" - }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -20305,128 +20443,18 @@ "node": ">= 0.8" } }, - "node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "license": "MIT", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", - "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "compressible": "~2.0.18", - "debug": "2.6.9", - "negotiator": "~0.6.4", - "on-headers": "~1.1.0", - "safe-buffer": "5.2.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "license": "MIT" }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" - }, - "node_modules/constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", - "license": "MIT" - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "license": "MIT" }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", - "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", - "license": "MIT" - }, "node_modules/copy-anything": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", @@ -20467,23 +20495,6 @@ "url": "https://opencollective.com/core-js" } }, - "node_modules/core-js-pure": { - "version": "3.49.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.49.0.tgz", - "integrity": "sha512-XM4RFka59xATyJv/cS3O3Kml72hQXUeGRuuTmMYFxwzc9/7C8OYTaIR/Ji+Yt8DXzsFLNhat15cE/JP15HrCgw==", - "hasInstallScript": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" - }, "node_modules/cosmiconfig": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", @@ -20500,49 +20511,6 @@ "node": ">=8" } }, - "node_modules/create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } - }, - "node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.12.4", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.4.tgz", - "integrity": "sha512-njR1b+ixG2ufvL9Zn9JGneW+b5GV6jqpYyPPpg4QVt723b5kJPGUczkUyWEH9BwEA74UakJZ43I4FDLBF7ci0g==", - "license": "MIT" - }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -20557,32 +20525,6 @@ "node": ">= 8" } }, - "node_modules/crypto-browserify": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.1.tgz", - "integrity": "sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==", - "license": "MIT", - "dependencies": { - "browserify-cipher": "^1.0.1", - "browserify-sign": "^4.2.3", - "create-ecdh": "^4.0.4", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "diffie-hellman": "^5.0.3", - "hash-base": "~3.0.4", - "inherits": "^2.0.4", - "pbkdf2": "^3.1.2", - "public-encrypt": "^4.0.3", - "randombytes": "^2.1.0", - "randomfill": "^1.0.4" - }, - "engines": { - "node": ">= 0.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/css-blank-pseudo": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-8.0.1.tgz", @@ -20608,18 +20550,6 @@ "postcss": "^8.4" } }, - "node_modules/css-declaration-sorter": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.4.0.tgz", - "integrity": "sha512-LTuzjPoyA2vMGKKcaOqKSp7Ub2eGrNfKiZH4LpezxpNrsICGCSFvsQOI29psISxNZtaXibkC2CXzrQ5enMeGGw==", - "license": "ISC", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, "node_modules/css-has-pseudo": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-8.0.0.tgz", @@ -20647,85 +20577,6 @@ "postcss": "^8.4" } }, - "node_modules/css-loader": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.4.tgz", - "integrity": "sha512-vv3J9tlOl04WjiMvHQI/9tmIrCxVrj6PFbHemBB1iihpeRbi/I4h033eoFIhwxBBqLhI0KYFS7yvynBFhIZfTw==", - "license": "MIT", - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.40", - "postcss-modules-extract-imports": "^3.1.0", - "postcss-modules-local-by-default": "^4.0.5", - "postcss-modules-scope": "^3.2.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.6.3" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || ^1.0.0 || ^2.0.0-0", - "webpack": "^5.27.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/css-minimizer-webpack-plugin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-8.0.0.tgz", - "integrity": "sha512-9bEpzHs8gEq6/cbEj418jXL/YWjBUD2YTLLk905Npt2JODqnRITin0+So5Vx4Dp5vyi2Lpt9pp2QHzQ7fdxNrw==", - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "cssnano": "^7.0.4", - "jest-worker": "^30.0.5", - "postcss": "^8.4.40", - "schema-utils": "^4.2.0", - "serialize-javascript": "^7.0.3" - }, - "engines": { - "node": ">= 20.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@parcel/css": { - "optional": true - }, - "@swc/css": { - "optional": true - }, - "clean-css": { - "optional": true - }, - "csso": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "lightningcss": { - "optional": true - } - } - }, "node_modules/css-prefers-color-scheme": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-11.0.0.tgz", @@ -20748,47 +20599,6 @@ "postcss": "^8.4" } }, - "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-tree": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", - "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", - "license": "MIT", - "dependencies": { - "mdn-data": "2.27.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/css-what": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, "node_modules/css.escape": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", @@ -20823,115 +20633,6 @@ "node": ">=4" } }, - "node_modules/cssnano": { - "version": "7.1.9", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.1.9.tgz", - "integrity": "sha512-uPR75+5Dk/WJ/YSPR1/YDHdwMM9c5FsaARljfKWgeCKLKOtJ0we21xy/RcCjn53fZnD/f6yYEIZ8pu18+GnbNQ==", - "license": "MIT", - "dependencies": { - "cssnano-preset-default": "^7.0.17", - "lilconfig": "^3.1.3" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.5.13" - } - }, - "node_modules/cssnano-preset-default": { - "version": "7.0.17", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.17.tgz", - "integrity": "sha512-11qO63A+czwguQFJCaTdICvbaxn0pJzz/XghLlv+OT7WyToDxAMR0Xb3/26/l0y0hQJywwNbj/SLSQlGBHE1OA==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.28.2", - "css-declaration-sorter": "^7.2.0", - "cssnano-utils": "^5.0.3", - "postcss-calc": "^10.1.1", - "postcss-colormin": "^7.0.10", - "postcss-convert-values": "^7.0.12", - "postcss-discard-comments": "^7.0.8", - "postcss-discard-duplicates": "^7.0.4", - "postcss-discard-empty": "^7.0.3", - "postcss-discard-overridden": "^7.0.3", - "postcss-merge-longhand": "^7.0.7", - "postcss-merge-rules": "^7.0.11", - "postcss-minify-font-values": "^7.0.3", - "postcss-minify-gradients": "^7.0.5", - "postcss-minify-params": "^7.0.9", - "postcss-minify-selectors": "^7.1.2", - "postcss-normalize-charset": "^7.0.3", - "postcss-normalize-display-values": "^7.0.3", - "postcss-normalize-positions": "^7.0.4", - "postcss-normalize-repeat-style": "^7.0.4", - "postcss-normalize-string": "^7.0.3", - "postcss-normalize-timing-functions": "^7.0.3", - "postcss-normalize-unicode": "^7.0.9", - "postcss-normalize-url": "^7.0.3", - "postcss-normalize-whitespace": "^7.0.3", - "postcss-ordered-values": "^7.0.4", - "postcss-reduce-initial": "^7.0.9", - "postcss-reduce-transforms": "^7.0.3", - "postcss-svgo": "^7.1.3", - "postcss-unique-selectors": "^7.0.7" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.5.13" - } - }, - "node_modules/cssnano-utils": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-5.0.3.tgz", - "integrity": "sha512-ynIREMICLxkxm7e9bCR9sh75s4Q5drICi0ua1yxo5jH2XPBqSKkl4dOh4EbFqtUmnTMhRffHgYL0EKKkMjtJTg==", - "license": "MIT", - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.5.13" - } - }, - "node_modules/csso": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", - "license": "MIT", - "dependencies": { - "css-tree": "~2.2.0" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/csso/node_modules/css-tree": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", - "license": "MIT", - "dependencies": { - "mdn-data": "2.0.28", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", - "license": "CC0-1.0" - }, "node_modules/cssom": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", @@ -21086,34 +20787,6 @@ "node": ">=0.10.0" } }, - "node_modules/default-browser": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", - "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", - "license": "MIT", - "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser-id": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", - "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -21166,15 +20839,6 @@ "node": ">=0.4.0" } }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -21184,24 +20848,14 @@ "node": ">=6" } }, - "node_modules/des.js": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", - "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "license": "MIT", + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "optional": true, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=8" } }, "node_modules/detect-newline": { @@ -21213,12 +20867,6 @@ "node": ">=8" } }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "license": "MIT" - }, "node_modules/detect-port-alt": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", @@ -21261,23 +20909,6 @@ "wrappy": "1" } }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.12.4", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.4.tgz", - "integrity": "sha512-njR1b+ixG2ufvL9Zn9JGneW+b5GV6jqpYyPPpg4QVt723b5kJPGUczkUyWEH9BwEA74UakJZ43I4FDLBF7ci0g==", - "license": "MIT" - }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -21290,18 +20921,6 @@ "node": ">=8" } }, - "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", - "license": "MIT", - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -21322,62 +20941,6 @@ "license": "MIT", "peer": true }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "license": "MIT", - "dependencies": { - "utila": "~0.4" - } - }, - "node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/dom-serializer/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/domain-browser": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-5.7.0.tgz", - "integrity": "sha512-edTFu0M/7wO1pXY6GDxVNVW086uqwWYIHP98txhcPyV995X21JIH2DtYp33sQJOupYoXKe9RwTw2Ya2vWaquTQ==", - "license": "Artistic-2.0", - "engines": { - "node": ">=4" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, "node_modules/domexception": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", @@ -21391,45 +20954,6 @@ "node": ">=12" } }, - "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/dotenv": { "version": "17.4.2", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.4.2.tgz", @@ -21483,39 +21007,12 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "license": "MIT" }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, "node_modules/electron-to-chromium": { "version": "1.5.388", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.388.tgz", "integrity": "sha512-Pl/aJaqOOxYxda3vcx1IKSJimwYXHDkEnGn0F+kG2EE68dDtx2uCinaS+Vih8Z91B9t8CSAbiF/HKyWcnXjhzw==", "license": "ISC" }, - "node_modules/elliptic": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", - "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", - "license": "MIT", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.4", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.4.tgz", - "integrity": "sha512-njR1b+ixG2ufvL9Zn9JGneW+b5GV6jqpYyPPpg4QVt723b5kJPGUczkUyWEH9BwEA74UakJZ43I4FDLBF7ci0g==", - "license": "MIT" - }, "node_modules/emittery": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", @@ -21534,29 +21031,12 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/enhanced-resolve": { "version": "5.24.2", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.2.tgz", "integrity": "sha512-rpsZEGT1jFuve6QlpyRp9ckQ+kN61hvF9BzCPyMdaKTm8UJce96KBn3sorXOFXlzjPrs3Vc4T1NsSroZ3PxlFw==", "license": "MIT", + "peer": true, "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" @@ -21577,15 +21057,6 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/environment": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", @@ -21620,15 +21091,6 @@ "is-arrayish": "^0.2.1" } }, - "node_modules/error-stack-parser": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", - "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", - "license": "MIT", - "dependencies": { - "stackframe": "^1.3.4" - } - }, "node_modules/es-abstract": { "version": "1.24.2", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", @@ -21739,7 +21201,8 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.0.tgz", "integrity": "sha512-KLdwQm2NvGLDkQDCGvmiQrhkd0JbMzXthwQAUgWjQuQdBLFa3eiBP5arXZyA+f8x+x7OXgud6bq2rxjGtHV2tw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/es-object-atoms": { "version": "1.1.2", @@ -21811,12 +21274,6 @@ "node": ">=6" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -28004,29 +27461,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-webpack-plugin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-6.0.0.tgz", - "integrity": "sha512-x9m9cH0Rw0RNJB/utP9AMGzmuXg/yLP/FCHSVSfsyjQUyetXN4g1BaIqxkj1i3mVX48aOys0bsVt63LLfh6oYg==", - "license": "MIT", - "dependencies": { - "@types/eslint": "^9.6.1", - "micromatch": "^4.0.8", - "normalize-path": "^3.0.0", - "schema-utils": "^4.3.3" - }, - "engines": { - "node": ">= 20.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "eslint": "^9.0.0 || ^10.0.0", - "webpack": "^5.0.0" - } - }, "node_modules/eslint/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -28130,49 +27564,16 @@ "node": ">=0.10.0" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "license": "MIT" - }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.8.x" } }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "license": "MIT", - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -28336,83 +27737,6 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/expose-loader": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/expose-loader/-/expose-loader-5.0.1.tgz", - "integrity": "sha512-5YPZuszN/eWND/B+xuq5nIpb/l5TV1HYmdO6SubYtHv+HenVw9/6bn33Mm5reY8DNid7AVtbARvyUD34edfCtg==", - "license": "MIT", - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/express": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", - "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "~1.20.5", - "content-disposition": "~0.5.4", - "content-type": "~1.0.4", - "cookie": "~0.7.1", - "cookie-signature": "~1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.3.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "~2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "~0.1.12", - "proxy-addr": "~2.0.7", - "qs": "~6.15.1", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "~0.19.0", - "serve-static": "~1.16.2", - "setprototypeof": "1.2.0", - "statuses": "~2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -28480,7 +27804,8 @@ "url": "https://opencollective.com/fastify" } ], - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "peer": true }, "node_modules/fastq": { "version": "1.20.1", @@ -28491,18 +27816,6 @@ "reusify": "^1.0.4" } }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "license": "Apache-2.0", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", @@ -28524,44 +27837,6 @@ "node": ">=16.0.0" } }, - "node_modules/file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "license": "MIT", - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/file-loader/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/filesize": { "version": "11.0.19", "resolved": "https://registry.npmjs.org/filesize/-/filesize-11.0.19.tgz", @@ -28583,39 +27858,6 @@ "node": ">=8" } }, - "node_modules/finalhandler": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", - "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "~2.4.1", - "parseurl": "~1.3.3", - "statuses": "~2.0.2", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -28651,30 +27893,11 @@ "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "license": "ISC" }, - "node_modules/follow-redirects": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", - "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, "node_modules/for-each": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, "license": "MIT", "dependencies": { "is-callable": "^1.2.7" @@ -28730,15 +27953,6 @@ "node": ">= 6" } }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/fraction.js": { "version": "5.3.4", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", @@ -28752,15 +27966,6 @@ "url": "https://github.com/sponsors/rawify" } }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/fs-extra": { "version": "11.3.6", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.6.tgz", @@ -28848,11 +28053,30 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" } }, + "node_modules/generic-names": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-4.0.0.tgz", + "integrity": "sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==", + "license": "MIT", + "dependencies": { + "loader-utils": "^3.2.0" + } + }, + "node_modules/generic-names/node_modules/loader-utils": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -28976,22 +28200,6 @@ "node": ">=10.13.0" } }, - "node_modules/glob-to-regex.js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz", - "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, "node_modules/glob/node_modules/balanced-match": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", @@ -29149,12 +28357,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "license": "MIT" - }, "node_modules/harmony-reflect": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", @@ -29238,29 +28440,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hash-base": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.5.tgz", - "integrity": "sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, "node_modules/hasown": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", @@ -29273,80 +28452,12 @@ "node": ">= 0.4" } }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "license": "MIT", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, "node_modules/hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "license": "ISC" }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/hpack.js/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/html-encoding-sniffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", @@ -29359,155 +28470,12 @@ "node": ">=12" } }, - "node_modules/html-entities": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", - "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ], - "license": "MIT" - }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "license": "MIT" }, - "node_modules/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "license": "MIT", - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/html-webpack-plugin": { - "version": "5.6.7", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.7.tgz", - "integrity": "sha512-md+vXtdCAe60s1k6AU3dUyMJnDxUyQAwfwPKoLisvgUF1IXjtlLsk2se54+qfL9Mdm26bbwvjJybpNx48NKRLw==", - "license": "MIT", - "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.20.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "node_modules/htmlparser2/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "license": "MIT" - }, - "node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", - "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", - "license": "MIT" - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/http-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", @@ -29522,36 +28490,6 @@ "node": ">= 6" } }, - "node_modules/http-proxy-middleware": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.10.tgz", - "integrity": "sha512-RKzRWNPxUZqbuk3BC5mGVJbBnWgr+diEnjJexIOytFbBzDy88Fbh/YvBr3DsNrl1jYAfjWfpATEv0NO35FDuPQ==", - "license": "MIT", - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "node_modules/https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", - "license": "MIT" - }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -29574,15 +28512,6 @@ "node": ">=10.17.0" } }, - "node_modules/hyperdyperid": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", - "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", - "license": "MIT", - "engines": { - "node": ">=10.18" - } - }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -29619,26 +28548,6 @@ "node": ">=4" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -29671,6 +28580,12 @@ "url": "https://opencollective.com/immer" } }, + "node_modules/immutable": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz", + "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==", + "license": "MIT" + }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", @@ -29771,31 +28686,6 @@ "node": ">= 0.4" } }, - "node_modules/ipaddr.js": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.4.0.tgz", - "integrity": "sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/is-arguments": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", - "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-array-buffer": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", @@ -29889,6 +28779,7 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -30025,6 +28916,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.4", @@ -30052,39 +28944,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "license": "MIT", - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-inside-container/node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", @@ -30098,22 +28957,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-nan": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", - "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-negative-zero": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", @@ -30127,18 +28970,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-network-error": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.2.tgz", - "integrity": "sha512-PhBY86zaxNZUuWP6h13Vu5oFe0XY6/UlKzQnYFELzGVHygP3MxmvTfYSG7GN3aIab/iWudSMgjSnG9Dq+nHrgA==", - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -30165,18 +28996,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", @@ -30187,6 +29006,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -30290,6 +29110,7 @@ "version": "1.1.15", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, "license": "MIT", "dependencies": { "which-typed-array": "^1.1.16" @@ -30387,6 +29208,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, "license": "MIT" }, "node_modules/isexe": { @@ -33700,6 +32522,8 @@ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", "license": "MIT", + "optional": true, + "peer": true, "bin": { "jiti": "lib/jiti-cli.mjs" } @@ -33855,16 +32679,6 @@ "node": ">=6" } }, - "node_modules/launch-editor": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.14.1.tgz", - "integrity": "sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA==", - "license": "MIT", - "dependencies": { - "picocolors": "^1.1.1", - "shell-quote": "^1.8.4" - } - }, "node_modules/less": { "version": "4.6.7", "resolved": "https://registry.npmjs.org/less/-/less-4.6.7.tgz", @@ -33890,32 +32704,6 @@ "source-map": "~0.6.0" } }, - "node_modules/less-loader": { - "version": "12.3.3", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-12.3.3.tgz", - "integrity": "sha512-F0+ErFFDj3Pt+nVrCN6VlEGEzocv9s7x/aR9v2riI+WM83UAfTYBDBjGPJnT55lBLR6JSI4fmWblt+aA2JN6/w==", - "license": "MIT", - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || ^1.0.0 || ^2.0.0-0", - "less": "^3.5.0 || ^4.0.0", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, "node_modules/less-plugin-npm-import": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/less-plugin-npm-import/-/less-plugin-npm-import-2.1.0.tgz", @@ -34089,18 +32877,6 @@ "node": ">=4" } }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -34112,6 +32888,7 @@ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.2.tgz", "integrity": "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==", "license": "MIT", + "peer": true, "engines": { "node": ">=6.11.5" }, @@ -34120,20 +32897,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -34149,10 +32912,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", - "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", "license": "MIT" }, "node_modules/lodash.debounce": { @@ -34161,33 +32924,12 @@ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "license": "MIT" }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "license": "MIT" - }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "license": "MIT" }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "license": "MIT" - }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -34240,70 +32982,6 @@ "node": ">= 0.4" } }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "license": "MIT", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/mdn-data": { - "version": "2.27.1", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", - "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", - "license": "CC0-1.0" - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "4.58.0", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.58.0.tgz", - "integrity": "sha512-0n6CDBqIT/eGrbWdDVNkLjasjupnEpOFjFOtXrS5p6EYYXGXBn5ZIMLetBlVdQYpP0hGK2MEOgYAC0/+NOr91w==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/fs-core": "4.58.0", - "@jsonjoy.com/fs-fsa": "4.58.0", - "@jsonjoy.com/fs-node": "4.58.0", - "@jsonjoy.com/fs-node-builtins": "4.58.0", - "@jsonjoy.com/fs-node-to-fsa": "4.58.0", - "@jsonjoy.com/fs-node-utils": "4.58.0", - "@jsonjoy.com/fs-print": "4.58.0", - "@jsonjoy.com/fs-snapshot": "4.58.0", - "@jsonjoy.com/json-pack": "^1.11.0", - "@jsonjoy.com/util": "^1.9.0", - "glob-to-regex.js": "^1.0.1", - "thingies": "^2.5.0", - "tree-dump": "^1.0.3", - "tslib": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -34319,15 +32997,6 @@ "node": ">= 8" } }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -34353,30 +33022,12 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.4", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.4.tgz", - "integrity": "sha512-njR1b+ixG2ufvL9Zn9JGneW+b5GV6jqpYyPPpg4QVt723b5kJPGUczkUyWEH9BwEA74UakJZ43I4FDLBF7ci0g==", - "license": "MIT" - }, "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "license": "MIT", + "optional": true, "bin": { "mime": "cli.js" }, @@ -34423,38 +33074,6 @@ "node": ">=4" } }, - "node_modules/mini-css-extract-plugin": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.10.2.tgz", - "integrity": "sha512-AOSS0IdEB95ayVkxn5oGzNQwqAi2J0Jb/kKm43t7H73s8+f5873g0yuj0PNvK4dO75mu5DHg4nlgp4k6Kga8eg==", - "license": "MIT", - "dependencies": { - "schema-utils": "^4.0.0", - "tapable": "^2.2.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "license": "ISC" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", - "license": "MIT" - }, "node_modules/minimatch": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", @@ -34481,6 +33100,7 @@ "resolved": "https://registry.npmjs.org/minimizer-webpack-plugin/-/minimizer-webpack-plugin-5.6.1.tgz", "integrity": "sha512-DoeAZz8Q1C1znwsUzej1fdoi4jCf7/+Em27ouLqfK/+3m8G+D7yDhUwrc3CNhjSzGUN1kn7Iv4sWmjflQHenpw==", "license": "MIT", + "peer": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", @@ -34541,6 +33161,7 @@ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "license": "MIT", + "peer": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -34555,6 +33176,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -34604,19 +33226,6 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, - "node_modules/multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "license": "MIT", - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, "node_modules/nanoid": { "version": "3.3.15", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", @@ -34673,30 +33282,19 @@ "node": ">= 4.4.x" } }, - "node_modules/negotiator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "license": "MIT" + "license": "MIT", + "peer": true }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } + "optional": true }, "node_modules/node-exports-info": { "version": "1.6.2", @@ -34733,56 +33331,6 @@ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "license": "MIT" }, - "node_modules/node-polyfill-webpack-plugin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/node-polyfill-webpack-plugin/-/node-polyfill-webpack-plugin-4.0.0.tgz", - "integrity": "sha512-WLk77vLpbcpmTekRj6s6vYxk30XoyaY5MDZ4+9g8OaKoG3Ij+TjOqhpQjVUlfDZBPBgpNATDltaQkzuXSnnkwg==", - "license": "MIT", - "dependencies": { - "assert": "^2.1.0", - "browserify-zlib": "^0.2.0", - "buffer": "^6.0.3", - "console-browserify": "^1.2.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.12.0", - "domain-browser": "^5.7.0", - "events": "^3.3.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "^1.0.1", - "process": "^0.11.10", - "punycode": "^2.3.1", - "querystring-es3": "^0.2.1", - "readable-stream": "^4.5.2", - "stream-browserify": "^3.0.0", - "stream-http": "^3.2.0", - "string_decoder": "^1.3.0", - "timers-browserify": "^2.0.12", - "tty-browserify": "^0.0.1", - "type-fest": "^4.18.2", - "url": "^0.11.3", - "util": "^0.12.5", - "vm-browserify": "^1.1.2" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "webpack": ">=5" - } - }, - "node_modules/node-polyfill-webpack-plugin/node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/node-releases": { "version": "2.0.50", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.50.tgz", @@ -34853,18 +33401,6 @@ "node": ">=8" } }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, "node_modules/nwsapi": { "version": "2.2.24", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.24.tgz", @@ -34875,6 +33411,7 @@ "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -34883,22 +33420,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -34997,33 +33518,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "license": "MIT" - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", - "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -35082,12 +33576,6 @@ "node": ">= 0.8.0" } }, - "node_modules/os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", - "license": "MIT" - }, "node_modules/os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -35165,23 +33653,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-retry": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", - "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", - "license": "MIT", - "dependencies": { - "@types/retry": "0.12.2", - "is-network-error": "^1.0.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -35197,22 +33668,6 @@ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "license": "BlueOak-1.0.0" }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "license": "(MIT AND Zlib)" - }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -35225,22 +33680,6 @@ "node": ">=6" } }, - "node_modules/parse-asn1": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.9.tgz", - "integrity": "sha512-fIYNuZ/HastSb80baGOuPRo1O9cf4baWw5WsAp7dBuUzeTD/BoaG8sVTdlPFksBE2lF21dN+A1AnrpIjSWqHHg==", - "license": "ISC", - "dependencies": { - "asn1.js": "^4.10.1", - "browserify-aes": "^1.2.0", - "evp_bytestokey": "^1.0.3", - "pbkdf2": "^3.1.5", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -35280,31 +33719,6 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "license": "MIT" - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -35363,12 +33777,6 @@ "node": "20 || >=22" } }, - "node_modules/path-to-regexp": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", - "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", - "license": "MIT" - }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -35378,23 +33786,6 @@ "node": ">=8" } }, - "node_modules/pbkdf2": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.6.tgz", - "integrity": "sha512-BT6eelPB1EyGHo8pC0o9Bl6k6SYVhKO1jEbd3lcTrtr7XHdjP8BW1YpfCV3G9Kwkxgattk+S5q2/RvuttCsS1g==", - "license": "MIT", - "dependencies": { - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "ripemd160": "^2.0.3", - "safe-buffer": "^5.2.1", - "sha.js": "^2.4.12", - "to-buffer": "^1.2.2" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -35559,27 +33950,11 @@ "node": ">=4" } }, - "node_modules/pkijs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.4.0.tgz", - "integrity": "sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw==", - "license": "BSD-3-Clause", - "dependencies": { - "@noble/hashes": "1.4.0", - "asn1js": "^3.0.6", - "bytestreamjs": "^2.0.1", - "pvtsutils": "^1.3.6", - "pvutils": "^1.1.3", - "tslib": "^2.8.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -35661,22 +34036,6 @@ "postcss": "^8.4" } }, - "node_modules/postcss-calc": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.1.1.tgz", - "integrity": "sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==", - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^7.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12 || ^20.9 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.38" - } - }, "node_modules/postcss-clamp": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", @@ -35773,40 +34132,6 @@ "postcss": "^8.4" } }, - "node_modules/postcss-colormin": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.10.tgz", - "integrity": "sha512-yFr6JezOolHLta/buLE71VKPh2mXursp4saVe98/ol8ZnEWhL+racShqPKlvd/DKWLre/39B6HhcMXf7RZ3hxg==", - "license": "MIT", - "dependencies": { - "@colordx/core": "^5.4.3", - "browserslist": "^4.28.2", - "caniuse-api": "^3.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.5.13" - } - }, - "node_modules/postcss-convert-values": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.12.tgz", - "integrity": "sha512-xurKu5qqk4viR3Cp3p4xBR4KfnZm4w4ys6+UBwBmeuBSNkH7+DtLnYOYnOffgtE4yx8sH9S1VZ6RAAvROXzP2Q==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.28.2", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.5.13" - } - }, "node_modules/postcss-custom-media": { "version": "12.0.1", "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-12.0.1.tgz", @@ -35917,57 +34242,6 @@ "postcss": "^8.4" } }, - "node_modules/postcss-discard-comments": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.8.tgz", - "integrity": "sha512-CvvS5S9WrXblFXCEJ9nVo+4z+eA7zSC7Z88V1HEJuwlQhlFnYTIjg1xJY+BCUiG2bvICap2tXii4mP22BD108Q==", - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^7.1.1" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.5.13" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.4.tgz", - "integrity": "sha512-VBNn1+EuMZkeGVVtz0gRfbNGtx9IFgAsAV+E2pHtXPrp4qfGBkhTIiAuE/wrb+Y6Pakg9NewAlfTpYIFAWODtw==", - "license": "MIT", - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.5.13" - } - }, - "node_modules/postcss-discard-empty": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-7.0.3.tgz", - "integrity": "sha512-M2pyjQCU+/7cMHVtL6bKTHjv0lZnPLMpicgr67Dlth7AbuV9gjVTtUqaRwn6Pp6BwSDspUzhz8SaUrRykJU5Dw==", - "license": "MIT", - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.5.13" - } - }, - "node_modules/postcss-discard-overridden": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-7.0.3.tgz", - "integrity": "sha512-aNovXo9UsZuRNLzHJtp13lHIvinDPfiXBPePpXkSjCbgp++iU2FqE+YxvjIsg6EdyPZsASFbfu+JcBFVsErXIQ==", - "license": "MIT", - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.5.13" - } - }, "node_modules/postcss-double-position-gradients": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-7.0.2.tgz", @@ -36140,91 +34414,6 @@ "postcss": "^8.4" } }, - "node_modules/postcss-loader": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.2.1.tgz", - "integrity": "sha512-k98jtRzthjj3f76MYTs9JTpRqV1RaaMhEU0Lpw9OTmQZQdppg4B30VZ74BojuBHt3F4KyubHJoXCMUeM8Bqeow==", - "license": "MIT", - "dependencies": { - "cosmiconfig": "^9.0.0", - "jiti": "^2.5.1", - "semver": "^7.6.2" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || ^1.0.0 || ^2.0.0-0", - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/postcss-loader/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/postcss-loader/node_modules/cosmiconfig": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.2.tgz", - "integrity": "sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==", - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/postcss-loader/node_modules/js-yaml": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", - "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/puzrin" - }, - { - "type": "github", - "url": "https://github.com/sponsors/nodeca" - } - ], - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/postcss-logical": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-9.0.0.tgz", @@ -36250,105 +34439,23 @@ "postcss": "^8.4" } }, - "node_modules/postcss-merge-longhand": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-7.0.7.tgz", - "integrity": "sha512-b3mfYUxR388u5Pt0HPcVIUtUDn/k15UfTY9M+ORW+meCR6JLNxoZffiYvXyOYQoRYQNZyX/UFkMCM/mNHxe1qA==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^7.0.11" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.5.13" - } - }, - "node_modules/postcss-merge-rules": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.11.tgz", - "integrity": "sha512-SJUPM18g2BmPhf8BVlbwqWz4aK3pLu6u6xjfwEzra7xL6IBR10sUaiB++EzqcVfadPHrKBSMlNdP+XieykhI+Q==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.28.2", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^5.0.3", - "postcss-selector-parser": "^7.1.1" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.5.13" - } - }, - "node_modules/postcss-minify-font-values": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-7.0.3.tgz", - "integrity": "sha512-yilG/VOaNI74IylQvAQQxm3/wZVBkXyYUqNUAdxqwtbWUXPsbK1q8Ms0mL83v+f8YicgcyfYCRZtWACUdYajpA==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.5.13" - } - }, - "node_modules/postcss-minify-gradients": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-7.0.5.tgz", - "integrity": "sha512-YraROyQRg3BI1+Hg8E05B/JPdnTm8EDSVu4P2BxdM+CRiOyfmou809+chGIqo6fQqwjPGQ947nbGncSjmTU1WQ==", - "license": "MIT", - "dependencies": { - "@colordx/core": "^5.4.3", - "cssnano-utils": "^5.0.3", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.5.13" - } - }, - "node_modules/postcss-minify-params": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.9.tgz", - "integrity": "sha512-R8itbB8BhlpoYyBm1ou0dD+vJnQ3F6adQipR4UnkCHUwlo+S9WXJaDRg1RHjC8YVAtIdrQzSWvJl40HnGDTKjA==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.28.2", - "cssnano-utils": "^5.0.3", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.5.13" - } - }, - "node_modules/postcss-minify-selectors": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-7.1.2.tgz", - "integrity": "sha512-aQtrEWKwqafNlExcKHQvPGsXR2+vlUqqJtf5XsCQcgsSb5PL4wlujWBYDJuWsP4UnQX1YHDHU8qRlD+1PzTQ+Q==", + "node_modules/postcss-modules": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-6.0.1.tgz", + "integrity": "sha512-zyo2sAkVvuZFFy0gc2+4O+xar5dYlaVy/ebO24KT0ftk/iJevSNyPyQellsBLlnccwh7f6V6Y4GvuKRYToNgpQ==", "license": "MIT", "dependencies": { - "browserslist": "^4.28.1", - "caniuse-api": "^3.0.0", - "cssesc": "^3.0.0", - "postcss-selector-parser": "^7.1.1" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" + "generic-names": "^4.0.0", + "icss-utils": "^5.1.0", + "lodash.camelcase": "^4.3.0", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "string-hash": "^1.1.3" }, "peerDependencies": { - "postcss": "^8.5.13" + "postcss": "^8.0.0" } }, "node_modules/postcss-modules-extract-imports": { @@ -36455,139 +34562,6 @@ "postcss": ">= 8" } }, - "node_modules/postcss-normalize-charset": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-7.0.3.tgz", - "integrity": "sha512-NoBfZu8PR4c2NlmjvrqQTzCzLY79hwcSRgNQ3ZiNK0ABzf9kYKloE/jNj+/8GQY1wsm8pRRgANk6ydLH8cwo0Q==", - "license": "MIT", - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.5.13" - } - }, - "node_modules/postcss-normalize-display-values": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.3.tgz", - "integrity": "sha512-ldsCX0QIt05pKIOobZtVQ48wXJecr+czw4+e1/YjVhLMqslShgpVxgPtI2CefURR8oyVoYaU/l829MMwExDMLw==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.5.13" - } - }, - "node_modules/postcss-normalize-positions": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-7.0.4.tgz", - "integrity": "sha512-VEvlpeGd3Ju1Hqa/oN4jaP3+ms4laYwkEL9N9u+B6k54PZjXbW1n6wI+aVprf1BQXlCYpS5+1pl/7/vHiKgARg==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.5.13" - } - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.4.tgz", - "integrity": "sha512-6mPKlY/8cSaDHxX502wERADarJsccwlky6yIrOapHH2ZgfoKAV94SbiTKfKEs4EEpdazuc3J72WsqeYk7hp9+Q==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.5.13" - } - }, - "node_modules/postcss-normalize-string": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-7.0.3.tgz", - "integrity": "sha512-HnEQPUchi1eznmDKEYrKUTqrprEq97SrpUYClgUkv7V2zRODD9DFoUsYU+m9ZOetmD5ku7fEMZB/lwy8IT6xVQ==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.5.13" - } - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.3.tgz", - "integrity": "sha512-zmEzHdvpZBZu0OKlbJSfgASQvaayyAoVuWtvyr34IJ/LyS+DaOKvvR3EvFJ9RWWtNIx+CMvO125OVophaxNYew==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.5.13" - } - }, - "node_modules/postcss-normalize-unicode": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.9.tgz", - "integrity": "sha512-DRAdWfeh/TjmhLJsw91vdiWCnUod9iwvM7xyS02/nF/sLsCR3A8l3pztrSUrWG8DSBqfX7yEk9FM0USaVJ2mSg==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.28.2", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.5.13" - } - }, - "node_modules/postcss-normalize-url": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-7.0.3.tgz", - "integrity": "sha512-CL93wmloq5qsffmFv+bw24MIRbmhHrp53qoh1LDAb/5TtjWEXI/np4xcP/Gw9oWCb2XyWnqHYLDUwiKRoJBA1Q==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.5.13" - } - }, - "node_modules/postcss-normalize-whitespace": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.3.tgz", - "integrity": "sha512-FdHjjn+Ht5Z2ZRjNOmeCbNq6lq09sUYKpmlF/Aq0XjVNSLTL6fmHlA/3swN2wP2caY9GV/tjSDcIIyS7aN7W0A==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.5.13" - } - }, "node_modules/postcss-opacity-percentage": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-3.0.0.tgz", @@ -36610,22 +34584,6 @@ "postcss": "^8.4" } }, - "node_modules/postcss-ordered-values": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-7.0.4.tgz", - "integrity": "sha512-nubSi49hDHQk4E8KIj+IbLY8Bg+8OcSUEhgyolgM+atnOvXjV7EjaR6bac4YGZoFyPa9mWoAF3EaYbWdFkKqVg==", - "license": "MIT", - "dependencies": { - "cssnano-utils": "^5.0.3", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.5.13" - } - }, "node_modules/postcss-overflow-shorthand": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-7.0.0.tgz", @@ -36809,37 +34767,6 @@ "postcss": "^8.4" } }, - "node_modules/postcss-reduce-initial": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.9.tgz", - "integrity": "sha512-ztTNPdIxXTxtBcG03E9u8v44M4ElXbMIRT7pf2onlquGula0Y83nKKxqM22FA/hMgkfCjN7ohevkVlaNwI8iOQ==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.28.2", - "caniuse-api": "^3.0.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.5.13" - } - }, - "node_modules/postcss-reduce-transforms": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.3.tgz", - "integrity": "sha512-FXsnN9ZwcZTT8Yf8cAHA8qIGUXcX6WfLd9JoYhrdDfmvsVhhfqkkv7m4AC3rwFOfz+GzkUa87OCKF9dUcicd+g==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.5.13" - } - }, "node_modules/postcss-replace-overflow-wrap": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", @@ -36902,37 +34829,6 @@ "node": ">=4" } }, - "node_modules/postcss-svgo": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-7.1.3.tgz", - "integrity": "sha512-2QfoFOYMcj8lwcVEf9WeTlkVIAm7u2QvOEhMzkQU3KUhhGX/l8hVV9EtjMv4iq3E9iI3OeeMN0YoMLbGusuigw==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^4.0.1" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >= 18" - }, - "peerDependencies": { - "postcss": "^8.5.13" - } - }, - "node_modules/postcss-unique-selectors": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-7.0.7.tgz", - "integrity": "sha512-d+sCkaRnSefghOUdH8CMJZV9yUQhj2ojpe8Nw/lA+LV1UOfeleGkLTl6XdCFFSai9UJ+DJPb69FFuqthXYsY8w==", - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^7.1.1" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.5.13" - } - }, "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", @@ -36994,16 +34890,6 @@ "node": ">=6.0.0" } }, - "node_modules/pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, "node_modules/pretty-format": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", @@ -37026,21 +34912,6 @@ "license": "MIT", "peer": true }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" - }, "node_modules/promise": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/promise/-/promise-7.0.4.tgz", @@ -37063,28 +34934,6 @@ "node": ">= 6" } }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, "node_modules/prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -37104,26 +34953,6 @@ "url": "https://github.com/sponsors/lupomontero" } }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.12.4", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.4.tgz", - "integrity": "sha512-njR1b+ixG2ufvL9Zn9JGneW+b5GV6jqpYyPPpg4QVt723b5kJPGUczkUyWEH9BwEA74UakJZ43I4FDLBF7ci0g==", - "license": "MIT" - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -37149,48 +34978,6 @@ ], "license": "MIT" }, - "node_modules/pvtsutils": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", - "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.8.1" - } - }, - "node_modules/pvutils": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz", - "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==", - "license": "MIT", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/qs": { - "version": "6.15.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", - "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", - "license": "BSD-3-Clause", - "dependencies": { - "es-define-property": "^1.0.1", - "side-channel": "^1.1.1" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", - "engines": { - "node": ">=0.4.x" - } - }, "node_modules/querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", @@ -37223,61 +35010,6 @@ "integrity": "sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg==", "license": "MIT" }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "license": "MIT", - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", - "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/react": { "version": "19.2.7", "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", @@ -37618,22 +35350,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/readdir-scoped-modules": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", @@ -37696,12 +35412,6 @@ "node": ">=8" } }, - "node_modules/reflect-metadata": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", - "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", - "license": "Apache-2.0" - }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", @@ -37799,40 +35509,6 @@ "regjsparser": "bin/parser" } }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "license": "MIT", - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, - "node_modules/renderkid/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -37847,6 +35523,7 @@ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -37908,15 +35585,6 @@ "node": ">=8" } }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/reusify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", @@ -37927,88 +35595,6 @@ "node": ">=0.10.0" } }, - "node_modules/ripemd160": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.3.tgz", - "integrity": "sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==", - "license": "MIT", - "dependencies": { - "hash-base": "^3.1.2", - "inherits": "^2.0.4" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/ripemd160/node_modules/hash-base": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.2.tgz", - "integrity": "sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^2.3.8", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/ripemd160/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/ripemd160/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/ripemd160/node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/ripemd160/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/ripemd160/node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/run-applescript": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", - "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -38052,26 +35638,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/safe-push-apply": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", @@ -38093,6 +35659,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -38118,44 +35685,52 @@ "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==", "license": "CC0-1.0" }, - "node_modules/sass-loader": { - "version": "16.0.8", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.8.tgz", - "integrity": "sha512-hcov4ZwZJIGbEuyNr9EmiTmZueyrxSToE6GOzoZnq5JM7ecRO7ttyvilPn+VmRsqiP16+VYZzVnGZj/hzZgKBA==", + "node_modules/sass": { + "version": "1.101.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.101.0.tgz", + "integrity": "sha512-OL3GoQyoUdDt843DpVmDO6y2k1sc5IhUDSpu8XucEI+35neq5QivZ1iuegnpraEVTJXlQGK1gl27zKcTLEPbQw==", "license": "MIT", "dependencies": { - "neo-async": "^2.6.2" + "chokidar": "^5.0.0", + "immutable": "^5.1.5", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" }, "engines": { - "node": ">= 18.12.0" + "node": ">=20.19.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/sass/node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" }, - "peerDependencies": { - "@rspack/core": "0.x || ^1.0.0 || ^2.0.0-0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", - "sass": "^1.3.0", - "sass-embedded": "*", - "webpack": "^5.0.0" + "engines": { + "node": ">= 20.19.0" }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "webpack": { - "optional": true - } + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sass/node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, "node_modules/sax": { @@ -38163,6 +35738,7 @@ "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", "license": "BlueOak-1.0.0", + "optional": true, "engines": { "node": ">=11.0.0" } @@ -38190,6 +35766,7 @@ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "license": "MIT", + "peer": true, "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -38209,6 +35786,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -38225,6 +35803,7 @@ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -38236,26 +35815,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "license": "MIT" - }, - "node_modules/selfsigned": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-5.5.0.tgz", - "integrity": "sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew==", "license": "MIT", - "dependencies": { - "@peculiar/x509": "^1.14.2", - "pkijs": "^3.3.3" - }, - "engines": { - "node": ">=18" - } + "peer": true }, "node_modules/semver": { "version": "7.8.5", @@ -38269,140 +35830,6 @@ "node": ">=10" } }, - "node_modules/send": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", - "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.1", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "~2.4.1", - "range-parser": "~1.2.1", - "statuses": "~2.0.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/serialize-javascript": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.0.7.tgz", - "integrity": "sha512-YAy8Od6KV+uuwUuU50np8fGB/Aues6Y0nAhA9y/hId74PlKUcme4pXcBD46NWKr1Q4osN/iseZ17YqO1XfmI8g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/serve-index": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.2.tgz", - "integrity": "sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.8.0", - "mime-types": "~2.1.35", - "parseurl": "~1.3.3" - }, - "engines": { - "node": ">= 0.8.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-static": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", - "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "~0.19.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -38451,38 +35878,6 @@ "node": ">= 0.4" } }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "license": "MIT" - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/sha.js": { - "version": "2.4.12", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", - "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", - "license": "(MIT AND BSD-3-Clause)", - "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.0" - }, - "bin": { - "sha.js": "bin.js" - }, - "engines": { - "node": ">= 0.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -38520,6 +35915,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -38539,6 +35935,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -38555,6 +35952,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -38573,6 +35971,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -38618,26 +36017,6 @@ "node": "*" } }, - "node_modules/sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "license": "MIT", - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "node_modules/source-map": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">= 12" - } - }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -38647,26 +36026,6 @@ "node": ">=0.10.0" } }, - "node_modules/source-map-loader": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-5.0.0.tgz", - "integrity": "sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA==", - "license": "MIT", - "dependencies": { - "iconv-lite": "^0.6.3", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.72.1" - } - }, "node_modules/source-map-support": { "version": "0.5.13", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", @@ -38746,50 +36105,6 @@ "spdx-ranges": "^2.0.0" } }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "node_modules/spdy-transport/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -38817,21 +36132,6 @@ "node": ">=8" } }, - "node_modules/stackframe": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "license": "MIT" - }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/stop-iteration-iterator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", @@ -38846,64 +36146,11 @@ "node": ">= 0.4" } }, - "node_modules/stream-browserify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", - "license": "MIT", - "dependencies": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - } - }, - "node_modules/stream-browserify/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/stream-http": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", - "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", - "license": "MIT", - "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "xtend": "^4.0.2" - } - }, - "node_modules/stream-http/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } + "node_modules/string-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", + "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==", + "license": "CC0-1.0" }, "node_modules/string-length": { "version": "4.0.2", @@ -39125,38 +36372,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/style-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-4.0.0.tgz", - "integrity": "sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==", - "license": "MIT", - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.27.0" - } - }, - "node_modules/stylehacks": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.11.tgz", - "integrity": "sha512-iODNfhXVLqc5LADs+Y6Oh5wJuK5ZcHbVng8aiK3y9pjMQdc5hLrBW0eFU6FtnpNrE6PoEg/MmFTU4waotj5WNg==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.28.2", - "postcss-selector-parser": "^7.1.1" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.5.13" - } - }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -39181,111 +36396,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/svgo": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.1.tgz", - "integrity": "sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==", - "license": "MIT", - "dependencies": { - "commander": "^11.1.0", - "css-select": "^5.1.0", - "css-tree": "^3.0.1", - "css-what": "^6.1.0", - "csso": "^5.0.5", - "picocolors": "^1.1.1", - "sax": "^1.5.0" - }, - "bin": { - "svgo": "bin/svgo.js" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/svgo" - } - }, - "node_modules/svgo/node_modules/commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", - "license": "MIT", - "engines": { - "node": ">=16" - } - }, - "node_modules/svgo/node_modules/css-select": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/svgo/node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/svgo/node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/svgo/node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/svgo/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -39312,6 +36422,7 @@ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", "license": "MIT", + "peer": true, "engines": { "node": ">=6" }, @@ -39350,6 +36461,7 @@ "resolved": "https://registry.npmjs.org/terser/-/terser-5.48.0.tgz", "integrity": "sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==", "license": "BSD-2-Clause", + "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", @@ -39363,106 +36475,19 @@ "node": ">=10" } }, - "node_modules/terser-webpack-plugin": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.6.1.tgz", - "integrity": "sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "terser": "^5.31.1" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@minify-html/node": { - "optional": true - }, - "@swc/core": { - "optional": true - }, - "@swc/css": { - "optional": true - }, - "@swc/html": { - "optional": true - }, - "clean-css": { - "optional": true - }, - "cssnano": { - "optional": true - }, - "csso": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "html-minifier-terser": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "postcss": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/terser-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/terser/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -39472,6 +36497,7 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "license": "MIT", + "peer": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -39518,60 +36544,12 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "license": "MIT" }, - "node_modules/thingies": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.6.0.tgz", - "integrity": "sha512-rMHRjmlFLM1R96UYPvpmnc3LYtdFrT33JIB7L9hetGue1qAPfn1N2LJeEjxUSidu1Iku+haLZXDuEXUHNGO/lg==", - "license": "MIT", - "engines": { - "node": ">=10.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "^2" - } - }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "license": "MIT" - }, - "node_modules/timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "license": "MIT", - "dependencies": { - "setimmediate": "^1.0.4" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "license": "BSD-3-Clause" }, - "node_modules/to-buffer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", - "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", - "license": "MIT", - "dependencies": { - "isarray": "^2.0.5", - "safe-buffer": "^5.2.1", - "typed-array-buffer": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -39584,15 +36562,6 @@ "node": ">=8.0" } }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, "node_modules/tough-cookie": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", @@ -39629,22 +36598,6 @@ "node": ">=12" } }, - "node_modules/tree-dump": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz", - "integrity": "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, "node_modules/treeify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz", @@ -39694,31 +36647,8 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/tsyringe": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.10.0.tgz", - "integrity": "sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==", - "license": "MIT", - "dependencies": { - "tslib": "^1.9.3" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/tsyringe/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" - }, - "node_modules/tty-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", - "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", - "license": "MIT" + "license": "0BSD", + "optional": true }, "node_modules/type-check": { "version": "0.4.0", @@ -39753,23 +36683,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/typed-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", @@ -39917,15 +36835,6 @@ "node": ">= 10.0.0" } }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/unrs-resolver": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.12.2.tgz", @@ -40002,19 +36911,6 @@ "punycode": "^2.1.0" } }, - "node_modules/url": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz", - "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", - "license": "MIT", - "dependencies": { - "punycode": "^1.4.1", - "qs": "^6.12.3" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/url-parse": { "version": "1.5.10", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", @@ -40025,25 +36921,6 @@ "requires-port": "^1.0.0" } }, - "node_modules/url/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "license": "MIT" - }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -40056,31 +36933,6 @@ "integrity": "sha512-mLs5zAK+ctllYBj+iAQvlDCwoxU/WDOUaJkcFudeiAX6OajC6BKXJUa9a+tbtkC11dz2Ufb7h0lyvIOVn4LADA==", "license": "MIT" }, - "node_modules/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "license": "MIT" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/v8-to-istanbul": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", @@ -40114,21 +36966,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "license": "MIT" - }, "node_modules/w3c-xmlserializer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", @@ -40155,6 +36992,7 @@ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.2.tgz", "integrity": "sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==", "license": "MIT", + "peer": true, "dependencies": { "graceful-fs": "^4.1.2" }, @@ -40162,15 +37000,6 @@ "node": ">=10.13.0" } }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "license": "MIT", - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -40185,6 +37014,7 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.108.4.tgz", "integrity": "sha512-yur8LyJoeiWh47dErD+Ok7vlbmDsJ3UbbRPAoxbGJ54WpE2y5yVo5G/inUzujnYgw3tPmBRdn+G7PoxXaYC33w==", "license": "MIT", + "peer": true, "dependencies": { "@types/estree": "^1.0.8", "@types/json-schema": "^7.0.15", @@ -40225,152 +37055,12 @@ } } }, - "node_modules/webpack-dev-middleware": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.5.tgz", - "integrity": "sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==", - "license": "MIT", - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^4.43.1", - "mime-types": "^3.0.1", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - } - } - }, - "node_modules/webpack-dev-middleware/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack-dev-middleware/node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/webpack-dev-server": { - "version": "5.2.6", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.6.tgz", - "integrity": "sha512-HNLRmamRvVavZQ+avceZifmv8hmdUjg43t6MI4SqJDwFdW7RPQwH5vzGhDRZSX59SgfbeHhLnq3g+uooWo7pVw==", - "license": "MIT", - "dependencies": { - "@types/bonjour": "^3.5.13", - "@types/connect-history-api-fallback": "^1.5.4", - "@types/express": "^4.17.25", - "@types/express-serve-static-core": "^4.17.21", - "@types/serve-index": "^1.9.4", - "@types/serve-static": "^1.15.5", - "@types/sockjs": "^0.3.36", - "@types/ws": "^8.5.10", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.2.1", - "chokidar": "^3.6.0", - "colorette": "^2.0.10", - "compression": "^1.8.1", - "connect-history-api-fallback": "^2.0.0", - "express": "^4.22.1", - "graceful-fs": "^4.2.6", - "http-proxy-middleware": "^2.0.9", - "ipaddr.js": "^2.1.0", - "launch-editor": "^2.14.1", - "open": "^10.0.3", - "p-retry": "^6.2.0", - "schema-utils": "^4.2.0", - "selfsigned": "^5.5.0", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^7.4.2", - "ws": "^8.18.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/webpack-dev-server/node_modules/open": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", - "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", - "license": "MIT", - "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "wsl-utils": "^0.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/webpack-sources": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.1.tgz", "integrity": "sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==", "license": "MIT", + "peer": true, "engines": { "node": ">=10.13.0" } @@ -40380,6 +37070,7 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "license": "BSD-2-Clause", + "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -40393,6 +37084,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "license": "BSD-2-Clause", + "peer": true, "engines": { "node": ">=4.0" } @@ -40402,33 +37094,11 @@ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } }, - "node_modules/websocket-driver": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.5.tgz", - "integrity": "sha512-ZL2+3c7kMBdIRCMz6l8jQMHyGVxj+UL+xVk74Ombiciboca8rHa15L86B19E5oh1pL9Ii/uj54gtsIrZGMo6zA==", - "license": "Apache-2.0", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/whatwg-encoding": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", @@ -40550,6 +37220,7 @@ "version": "1.1.22", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==", + "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", @@ -40717,36 +37388,6 @@ } } }, - "node_modules/wsl-utils": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", - "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", - "license": "MIT", - "dependencies": { - "is-wsl": "^3.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/wsl-utils/node_modules/is-wsl": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", - "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", - "license": "MIT", - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/xml-name-validator": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", @@ -40762,15 +37403,6 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "license": "MIT" }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/package.json b/package.json index d492bb41..f7472517 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,8 @@ "enact": "./bin/enact.js" }, "engines": { - "node": "^20.12.0 || ^22.0.0 || >=24.0.0" + "node": "^20.12.0 || ^22.0.0 || >=24.0.0", + "bun": ">=1.3.0" }, "publishConfig": { "access": "public" @@ -43,51 +44,41 @@ "upupdowndownleftrightleftrightbastart" ], "dependencies": { + "@babel/core": "^7.29.0", "@babel/plugin-transform-modules-commonjs": "^7.29.7", "@daltontan/postcss-import-json": "^1.1.1", "@enact/dev-utils": "^7.0.5", "@enact/template-limestone": "1.0.0", - "@pmmmwh/react-refresh-webpack-plugin": "^0.6.2", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", "@testing-library/user-event": "^14.6.1", "babel-jest": "^30.4.1", - "babel-loader": "^10.1.1", "babel-plugin-dynamic-import-node": "^2.3.3", "babel-plugin-transform-rename-import": "^2.3.0", "babel-preset-enact": "^0.1.17", - "case-sensitive-paths-webpack-plugin": "^2.4.0", + "bun": "^1.3.14", "chalk": "^5.6.2", "core-js": "3.22.8", "cross-spawn": "^7.0.6", - "css-loader": "^7.1.4", - "css-minimizer-webpack-plugin": "^8.0.0", "dotenv": "^17.4.2", "dotenv-expand": "^13.0.0", "eslint": "^9.39.4", "eslint-config-enact": "^5.1.2", - "eslint-webpack-plugin": "^6.0.0", - "expose-loader": "^5.0.1", - "file-loader": "^6.2.0", "filesize": "^11.0.19", "fs-extra": "^11.3.6", "glob": "^13.0.6", "global-modules": "^2.0.0", - "html-webpack-plugin": "^5.6.7", "identity-obj-proxy": "^3.0.0", "jest": "~30.3.0", "jest-environment-jsdom": "29.7.0", "jest-watch-typeahead": "^3.0.1", "less": "^4.6.7", - "less-loader": "^12.3.2", "less-plugin-npm-import": "^2.1.0", "license-checker": "^25.0.1", - "mini-css-extract-plugin": "^2.10.2", "minimist": "^1.2.8", - "node-polyfill-webpack-plugin": "4.0.0", "postcss": "^8.5.16", "postcss-flexbugs-fixes": "^5.0.2", - "postcss-loader": "^8.2.1", + "postcss-modules": "^6.0.1", "postcss-normalize": "^13.0.1", "postcss-preset-env": "^11.3.2", "postcss-resolution-independence": "^1.1.11", @@ -100,16 +91,11 @@ "react-test-renderer": "^19.2.7", "resolution-independence": "^1.0.0", "resolve": "^1.22.12", - "sass-loader": "^16.0.7", + "sass": "^1.101.0", "semver": "^7.8.5", - "source-map-loader": "^5.0.0", "strip-ansi": "^7.2.0", - "style-loader": "^4.0.0", "tar": "^7.5.19", - "terser-webpack-plugin": "^5.6.1", - "validate-npm-package-name": "^7.0.2", - "webpack": "^5.108.4", - "webpack-dev-server": "^5.2.5" + "validate-npm-package-name": "^7.0.2" }, "optionalDependencies": { "fsevents": "^2.3.3" @@ -132,4 +118,4 @@ "globals": "^17.7.0", "prettier": "^3.9.4" } -} \ No newline at end of file +} From 644a08dfa1e01cd7edf1e162cecee5a77b04b284 Mon Sep 17 00:00:00 2001 From: Dan Ichim Date: Mon, 13 Jul 2026 15:55:18 +0300 Subject: [PATCH 02/20] Resolve webpack-style tilde imports in LESS and PostCSS Bun's CSS pipeline does not understand ~package/path imports that css-loader and less-loader handled in webpack. Add shared resolution for @import and @import-json, plus a LESS FileManager for .less imports. --- config/bun/plugins/less-enact.js | 29 +++++++++-- config/bun/plugins/postcss-enact.js | 44 ++++++++++------ config/bun/plugins/resolve-tilde-import.js | 59 ++++++++++++++++++++++ 3 files changed, 114 insertions(+), 18 deletions(-) create mode 100644 config/bun/plugins/resolve-tilde-import.js diff --git a/config/bun/plugins/less-enact.js b/config/bun/plugins/less-enact.js index a6198752..ea09e32d 100644 --- a/config/bun/plugins/less-enact.js +++ b/config/bun/plugins/less-enact.js @@ -1,13 +1,33 @@ const path = require('path'); const less = require('less'); const sass = require('sass'); -const postcss = require('postcss'); const {createPostcssEnactPlugin} = require('./postcss-enact'); +const {resolveTildeImport} = require('./resolve-tilde-import'); function isModuleStylesheet (filePath, forceCSSModules) { return forceCSSModules || /\.module\.(css|less|scss|sass)$/.test(filePath); } +function createLessTildePlugin (appContext) { + class TildeFileManager extends less.FileManager { + supports (filename) { + return filename.charAt(0) === '~'; + } + + loadFile (filename, currentDirectory, options, environment) { + const resolvedPath = resolveTildeImport(filename.slice(1), currentDirectory, appContext); + return super.loadFile(resolvedPath, path.dirname(resolvedPath), options, environment); + } + } + + return { + install (_less, pluginManager) { + pluginManager.addFileManager(new TildeFileManager()); + }, + minVersion: [3, 0, 0] + }; +} + async function compileSass (source, filePath) { const result = sass.compileString(source, { url: new URL(`file:///${filePath.replace(/\\/g, '/')}`), @@ -19,6 +39,8 @@ async function compileSass (source, filePath) { function createLessEnactPlugin (options = {}) { const postcssPlugin = createPostcssEnactPlugin(options); + const appContext = options.context || process.cwd(); + const lessTildePlugin = createLessTildePlugin(appContext); return { name: 'enact-less', @@ -47,9 +69,10 @@ function createLessEnactPlugin (options = {}) { const source = await Bun.file(args.path).text(); const lessResult = await less.render(source, { filename: args.path, - paths: [path.dirname(args.path)], + paths: [path.dirname(args.path), path.join(appContext, 'node_modules')], modifyVars: Object.assign({__DEV__: !options.production}, options.accent || {}), - javascriptEnabled: true + javascriptEnabled: true, + plugins: [lessTildePlugin] }); const processed = await postcssPlugin.processCss(lessResult.css, args.path); diff --git a/config/bun/plugins/postcss-enact.js b/config/bun/plugins/postcss-enact.js index fab82b72..11153733 100644 --- a/config/bun/plugins/postcss-enact.js +++ b/config/bun/plugins/postcss-enact.js @@ -1,35 +1,50 @@ -const fs = require('fs'); const path = require('path'); const postcss = require('postcss'); const postcssImportJson = require('@daltontan/postcss-import-json'); const postcssModules = require('postcss-modules'); const {cssModuleIdent: getLocalIdent} = require('@enact/dev-utils'); +const { + resolveTildeImport, + toCssRelativeImport, + parseImportPath, + formatImportParams +} = require('./resolve-tilde-import'); -function createPostcssImportJsonTildePlugin () { +function createPostcssImportTildePlugin (appContext = process.cwd()) { return { - postcssPlugin: 'postcss-import-json-tilde', + postcssPlugin: 'postcss-import-tilde', Once (root) { - root.walkAtRules('import-json', atRule => { - let src = atRule.params.slice(1, -1); - if (!src.startsWith('~')) return; + const inputFile = root.source?.input?.file || appContext; + const currentFileDir = path.dirname(inputFile); + + root.walkAtRules(atRule => { + if (atRule.name !== 'import' && atRule.name !== 'import-json') { + return; + } + + const src = parseImportPath(atRule.params); + if (!src.startsWith('~')) { + return; + } - const packagePath = src.substring(1); - const currentFileDir = path.dirname(atRule.source.input.file || process.cwd()); - let resolvedPath; try { - resolvedPath = require.resolve(packagePath, {paths: [currentFileDir]}); - } catch (e) { - resolvedPath = require.resolve(packagePath, {paths: [process.cwd()]}); + const resolvedPath = resolveTildeImport(src.slice(1), currentFileDir, appContext); + const relativePath = toCssRelativeImport(currentFileDir, resolvedPath); + atRule.params = formatImportParams(atRule.params, relativePath); + } catch (error) { + if (process.env.NODE_ENV !== 'test') { + console.warn(`Could not resolve ${src}: ${error.message}`); + } } - atRule.params = `"${path.relative(currentFileDir, resolvedPath)}"`; }); } }; } -createPostcssImportJsonTildePlugin.postcss = true; +createPostcssImportTildePlugin.postcss = true; function buildPostcssPlugins (options = {}) { return [ + createPostcssImportTildePlugin(options.context), options.useTailwind && require('tailwindcss'), require('postcss-flexbugs-fixes'), require('postcss-preset-env')({ @@ -39,7 +54,6 @@ function buildPostcssPlugins (options = {}) { }), !options.useTailwind && require('postcss-normalize'), options.ri !== false && require('postcss-resolution-independence')(options.ri), - createPostcssImportJsonTildePlugin(), postcssImportJson({ map: (selector, value) => { if (typeof value === 'object' && value !== null && value.$ref) { diff --git a/config/bun/plugins/resolve-tilde-import.js b/config/bun/plugins/resolve-tilde-import.js new file mode 100644 index 00000000..07bfcbc1 --- /dev/null +++ b/config/bun/plugins/resolve-tilde-import.js @@ -0,0 +1,59 @@ +const path = require('path'); + +function resolveTildeImport (packagePath, fromDir, appContext = process.cwd()) { + const searchPaths = [ + fromDir, + appContext, + path.join(appContext, 'node_modules') + ]; + + for (const searchPath of searchPaths) { + try { + return require.resolve(packagePath, {paths: [searchPath]}); + } catch (e) { + // try next search path + } + } + + throw new Error(`Could not resolve: ~${packagePath}`); +} + +function toCssRelativeImport (fromDir, resolvedPath) { + let relativePath = path.relative(fromDir, resolvedPath).replace(/\\/g, '/'); + if (!relativePath.startsWith('.')) { + relativePath = `./${relativePath}`; + } + return relativePath; +} + +function parseImportPath (params) { + const trimmed = params.trim(); + const urlMatch = trimmed.match(/^url\(\s*(['"]?)([^'")]+)\1\s*\)$/i); + if (urlMatch) { + return urlMatch[2]; + } + + if ( + (trimmed.startsWith('"') && trimmed.endsWith('"')) || + (trimmed.startsWith("'") && trimmed.endsWith("'")) + ) { + return trimmed.slice(1, -1); + } + + return trimmed; +} + +function formatImportParams (params, resolvedRelativePath) { + const trimmed = params.trim(); + if (/^url\(/i.test(trimmed)) { + return `url("${resolvedRelativePath}")`; + } + return `"${resolvedRelativePath}"`; +} + +module.exports = { + resolveTildeImport, + toCssRelativeImport, + parseImportPath, + formatImportParams +}; From 56b967bb0ea09e9e3ed08da709060fac1a70043e Mon Sep 17 00:00:00 2001 From: Dan Ichim Date: Mon, 13 Jul 2026 16:35:21 +0300 Subject: [PATCH 03/20] less global --- config/bun/plugins/less-enact.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/bun/plugins/less-enact.js b/config/bun/plugins/less-enact.js index ea09e32d..3d264a82 100644 --- a/config/bun/plugins/less-enact.js +++ b/config/bun/plugins/less-enact.js @@ -48,8 +48,8 @@ function createLessEnactPlugin (options = {}) { build.onLoad({filter: /\.(scss|sass)$/}, async args => { const source = await Bun.file(args.path).text(); const css = await compileSass(source, args.path); - const processed = await postcssPlugin.processCss(css, args.path); const moduleMode = isModuleStylesheet(args.path, options.forceCSSModules); + const processed = await postcssPlugin.processCss(css, args.path, moduleMode); if (moduleMode) { return { @@ -75,8 +75,8 @@ function createLessEnactPlugin (options = {}) { plugins: [lessTildePlugin] }); - const processed = await postcssPlugin.processCss(lessResult.css, args.path); const moduleMode = isModuleStylesheet(args.path, options.forceCSSModules); + const processed = await postcssPlugin.processCss(lessResult.css, args.path, moduleMode); if (moduleMode) { return { From 3b75253af517eb4b600f7cbeddbcbe2e418aea34 Mon Sep 17 00:00:00 2001 From: Dan Ichim Date: Mon, 13 Jul 2026 17:29:36 +0300 Subject: [PATCH 04/20] fix lint --- .github/workflows/ci-reusable.yml | 2 +- commands/pack.js | 8 +- commands/serve.js | 2 +- config/bun/build-framework.mjs | 4 +- config/bun/build-options.js | 1 + config/bun/build.mjs | 37 ++++----- config/bun/dev-serve-utils.js | 9 +-- config/bun/dev-server.mjs | 25 +++--- config/bun/framework.js | 4 +- config/bun/generate-html.js | 4 +- config/bun/plugins/case-sensitive-enact.js | 8 +- config/bun/plugins/less-enact.js | 18 +++-- config/bun/plugins/postcss-enact.js | 12 +-- config/bun/plugins/resolve-enact.js | 34 +++++++- config/bun/plugins/resolve-tilde-import.js | 93 +++++++++++++++++++++- config/bun/plugins/snapshot-enact.js | 2 +- config/bun/plugins/typescript-enact.js | 2 +- config/bun/prerender.js | 2 +- config/bun/resolve-bun.js | 2 +- config/bun/resolve-dev-utils.js | 4 +- config/bun/webos-meta.js | 2 +- eslint.config.js | 36 +++++++++ package.json | 4 +- 23 files changed, 237 insertions(+), 78 deletions(-) create mode 100644 eslint.config.js diff --git a/.github/workflows/ci-reusable.yml b/.github/workflows/ci-reusable.yml index 381867fa..65a88df7 100644 --- a/.github/workflows/ci-reusable.yml +++ b/.github/workflows/ci-reusable.yml @@ -35,4 +35,4 @@ jobs: - name: Run ESLint run: | - npm run lint -- -- --report-unused-disable-directives --max-warnings 0 + npm run lint -- --report-unused-disable-directives --max-warnings 0 diff --git a/commands/pack.js b/commands/pack.js index cbde3f89..fd347bac 100755 --- a/commands/pack.js +++ b/commands/pack.js @@ -130,12 +130,12 @@ function api (opts = {}) { } else { console.log('Creating an optimized production framework build...'); } - const output = path.resolve(opts.output || path.join(app.context, 'dist')); - return fs.emptyDir(output).then(() => - spawnBunScript('build-framework.mjs', buildArgs({...opts, output}), {cwd: app.context}).then(() => { + const frameworkOutput = path.resolve(opts.output || path.join(app.context, 'dist')); + return fs.emptyDir(frameworkOutput).then(() => + spawnBunScript('build-framework.mjs', buildArgs({...opts, output: frameworkOutput}), {cwd: app.context}).then(() => { console.log(chalk.green('Compiled successfully.')); console.log(); - printFileSizes(output); + printFileSizes(frameworkOutput); console.log(); }) ); diff --git a/commands/serve.js b/commands/serve.js index 2cab3266..067c28b4 100755 --- a/commands/serve.js +++ b/commands/serve.js @@ -44,7 +44,7 @@ function api (opts) { if (opts.fast) process.env.FAST_REFRESH = 'true'; const host = process.env.HOST || opts.host || '0.0.0.0'; - const port = parseInt(process.env.PORT || opts.port || 8080, 10); + const port = parseInt(process.env.PORT || opts.port || 8080); if (['node', 'async-node', 'webworker'].includes(app.environment)) { return Promise.reject(new Error('Serving is not supported for non-browser apps.')); diff --git a/config/bun/build-framework.mjs b/config/bun/build-framework.mjs index 4909dc8f..8ee283fb 100644 --- a/config/bun/build-framework.mjs +++ b/config/bun/build-framework.mjs @@ -4,8 +4,8 @@ import {createRequire} from 'module'; import {createBuildOptions} from './build-options.js'; import {createEnactPlugins} from './plugins/index.js'; -const require = createRequire(import.meta.url); -const {applyFramework} = require('./framework.js'); +const nodeRequire = createRequire(import.meta.url); +const {applyFramework} = nodeRequire('./framework.js'); function parseArgs (argv) { const opts = {production: false, output: null, context: null, snapshot: false, externalsPolyfill: false, linting: true}; diff --git a/config/bun/build-options.js b/config/bun/build-options.js index 6c75a363..42abd260 100644 --- a/config/bun/build-options.js +++ b/config/bun/build-options.js @@ -169,6 +169,7 @@ function createBuildOptions (opts = {}) { minify: opts.minify !== false && opts.production, sourcemap: (process.env.GENERATE_SOURCEMAP || (opts.production ? 'false' : 'true')) !== 'false', aliases: getResolveAliases(context), + additionalModulePaths: app.additionalModulePaths, isomorphic: !!opts.isomorphic, snapshot: useSnapshot, noAnimation: !!opts.noAnimation, diff --git a/config/bun/build.mjs b/config/bun/build.mjs index e9595ac0..a58f8002 100644 --- a/config/bun/build.mjs +++ b/config/bun/build.mjs @@ -6,7 +6,7 @@ import {writeIndexHtml} from './generate-html.js'; import {createEnactPlugins} from './plugins/index.js'; import {getIsomorphicExternals} from './plugins/isomorphic-enact.js'; -const require = createRequire(import.meta.url); +const nodeRequire = createRequire(import.meta.url); function parseArgs (argv) { const opts = { @@ -116,7 +116,7 @@ function createBuildConfig (buildOpts, options, plugins) { function getExternalHtmlAssets (buildOpts) { if (!buildOpts.externals) return null; - const {getExternalAssets} = require('./externals.js'); + const {getExternalAssets} = nodeRequire('./externals.js'); return getExternalAssets(buildOpts.externals, buildOpts.externalsPublic); } @@ -139,7 +139,7 @@ function getStartupAssets (publicPath, jsName, buildOpts) { return assets; } -async function buildReactGlobals (options, buildOpts) { +async function buildReactGlobals (options, _buildOpts) { const globalsEntry = path.join(path.dirname(fileURLToPath(import.meta.url)), 'react-globals-entry.js'); const result = await Bun.build({ entrypoints: [globalsEntry], @@ -190,7 +190,7 @@ function finalizeBuild (result, buildOpts, options) { externalStyles: externalAssets?.styles }); - require('./post-build.js').applyPostBuild(options.context, options.outputPath, { + nodeRequire('./post-build.js').applyPostBuild(options.context, options.outputPath, { publicPath: options.publicPath, ilibAdditionalResourcesPath: options.ilibAdditionalResourcesPath, customSkin: options.customSkin, @@ -198,8 +198,8 @@ function finalizeBuild (result, buildOpts, options) { }); if (buildOpts.isomorphic) { - const app = require('@enact/dev-utils/option-parser'); - const applyBunPostBuild = require('./prerender.js').applyPrerender; + const app = nodeRequire('@enact/dev-utils/option-parser'); + const applyBunPostBuild = nodeRequire('./prerender.js').applyPrerender; applyBunPostBuild({ context: options.context, output: options.outputPath, @@ -218,13 +218,13 @@ function finalizeBuild (result, buildOpts, options) { let v8SnapshotFile; if (buildOpts.snapshot) { if (buildOpts.externals) { - const {getFrameworkPublicPath} = require('./externals.js'); + const {getFrameworkPublicPath} = nodeRequire('./externals.js'); const frameworkPublicPath = getFrameworkPublicPath(buildOpts.externals, buildOpts.externalsPublic); if (frameworkPublicPath) { v8SnapshotFile = `${frameworkPublicPath}/snapshot_blob.bin`.replace(/\/{2,}/g, '/'); } } else { - require('./snapshot.js').applySnapshot({ + nodeRequire('./snapshot.js').applySnapshot({ output: options.outputPath, target: jsName }); @@ -233,13 +233,13 @@ function finalizeBuild (result, buildOpts, options) { } if (v8SnapshotFile) { - require('./webos-meta.js').applyWebOSMeta(options.context, options.outputPath, { + nodeRequire('./webos-meta.js').applyWebOSMeta(options.context, options.outputPath, { v8SnapshotFile }); } if (buildOpts.stats) { - require('./generate-stats.js').writeStatsReport(options.outputPath, result.metafile); + nodeRequire('./generate-stats.js').writeStatsReport(options.outputPath, result.metafile); } return {jsName, cssName}; @@ -271,6 +271,7 @@ async function runBuild (buildOpts) { production: buildOpts.production, sourcemap: options.sourcemap, context: options.context, + additionalModulePaths: options.additionalModulePaths, accent: options.accent, forceCSSModules: options.forceCSSModules, useTailwind: options.useTailwind, @@ -284,7 +285,7 @@ async function runBuild (buildOpts) { ? { polyfill: polyfillPath, context: options.context, - local: require('./plugins/externals-enact').shouldEnableLocalExternals(options.context) + local: nodeRequire('./plugins/externals-enact').shouldEnableLocalExternals(options.context) } : undefined }); @@ -297,7 +298,7 @@ async function runBuild (buildOpts) { if (buildOpts.watch) { console.log('Watching for file changes...'); - const result = await Bun.build({ + const watchResult = await Bun.build({ ...buildConfig, watch: { onRebuild (error, rebuildResult) { @@ -305,18 +306,18 @@ async function runBuild (buildOpts) { console.error('Rebuild failed:', error); return; } - const info = finalizeBuild(rebuildResult, buildOpts, options); - if (info) { + const rebuildInfo = finalizeBuild(rebuildResult, buildOpts, options); + if (rebuildInfo) { console.log('Recompiled successfully.'); - logBuildResult(buildOpts, options, info); + logBuildResult(buildOpts, options, rebuildInfo); } } } }); - const info = finalizeBuild(result, buildOpts, options); - if (!info) process.exit(1); - logBuildResult(buildOpts, options, info); + const watchInfo = finalizeBuild(watchResult, buildOpts, options); + if (!watchInfo) process.exit(1); + logBuildResult(buildOpts, options, watchInfo); await new Promise(() => {}); return; diff --git a/config/bun/dev-serve-utils.js b/config/bun/dev-serve-utils.js index 5b9ed750..2cabcaf3 100644 --- a/config/bun/dev-serve-utils.js +++ b/config/bun/dev-serve-utils.js @@ -46,10 +46,9 @@ function createSetupProxyHandler (context) { return null; } - let createProxyMiddleware; try { - createProxyMiddleware = require(require.resolve('http-proxy-middleware', {paths: [context]})); - } catch (e) { + require(require.resolve('http-proxy-middleware', {paths: [context]})); + } catch (_e) { console.warn('setupProxy.js found but http-proxy-middleware is not installed in the project.'); return null; } @@ -87,7 +86,7 @@ function createSetupProxyHandler (context) { function getDevOverlayScript () { try { const requireFromCli = createRequire(path.join(__dirname, '..', '..', 'package.json')); - const overlayPath = requireFromCli.resolve('react-error-overlay/lib/index'); + requireFromCli.resolve('react-error-overlay/lib/index'); return [ '' ].join('\n'); - } catch (e) { + } catch (_e) { return ''; } } diff --git a/config/bun/dev-server.mjs b/config/bun/dev-server.mjs index aac412c7..7a768dfc 100644 --- a/config/bun/dev-server.mjs +++ b/config/bun/dev-server.mjs @@ -1,6 +1,5 @@ import path from 'path'; import fs from 'fs'; -import {fileURLToPath} from 'url'; import {createRequire} from 'module'; import {createBuildOptions, getCacheDir, ensureEntryFile} from './build-options.js'; import {writeDevHtml} from './generate-html.js'; @@ -14,8 +13,7 @@ import { createSetupProxyHandler } from './dev-serve-utils.js'; -const __dirname = path.dirname(fileURLToPath(import.meta.url)); -const require = createRequire(import.meta.url); +const nodeRequire = createRequire(import.meta.url); function parseArgs (argv) { const opts = { @@ -37,17 +35,17 @@ function parseArgs (argv) { return opts; } -async function runBuild (buildOpts, entryFile, plugins, cacheDir) { +async function runBuild (opts, entry, buildPlugins, outDir) { const result = await Bun.build({ - entrypoints: [entryFile], - outdir: cacheDir, + entrypoints: [entry], + outdir: outDir, target: 'browser', minify: false, - sourcemap: buildOpts.sourcemap ? 'linked' : 'none', - define: buildOpts.defines, - publicPath: buildOpts.publicPath || '/', - plugins, - alias: buildOpts.aliases + sourcemap: opts.sourcemap ? 'linked' : 'none', + define: opts.defines, + publicPath: opts.publicPath || '/', + plugins: buildPlugins, + alias: opts.aliases }); if (!result.success) { for (const log of result.logs) console.error(log); @@ -71,7 +69,7 @@ const buildOpts = createBuildOptions({ const cacheDir = getCacheDir(buildOpts.context); fs.mkdirSync(cacheDir, {recursive: true}); -const app = require('@enact/dev-utils/option-parser'); +const app = nodeRequire('@enact/dev-utils/option-parser'); const entryFile = ensureEntryFile(buildOpts.context, buildOpts.mainEntry, { isomorphic: false, snapshot: false, @@ -81,6 +79,7 @@ const plugins = createEnactPlugins({ production: false, sourcemap: buildOpts.sourcemap, context: buildOpts.context, + additionalModulePaths: buildOpts.additionalModulePaths, accent: buildOpts.accent, forceCSSModules: buildOpts.forceCSSModules, useTailwind: buildOpts.useTailwind, @@ -190,7 +189,7 @@ const localUrl = `${protocol}://localhost:${server.port}${normalizePublicPath(pu console.log(`Starting the development server at ${localUrl}`); if (cliOpts.open) { - const openBrowser = require('react-dev-utils/openBrowser'); + const openBrowser = nodeRequire('react-dev-utils/openBrowser'); openBrowser(localUrl); } diff --git a/config/bun/framework.js b/config/bun/framework.js index 15918d60..efcca0d3 100644 --- a/config/bun/framework.js +++ b/config/bun/framework.js @@ -45,7 +45,7 @@ function getModuleId (nodeModules, file) { return path.relative(nodeModules, dir).replace(/\\/g, '/'); } } - } catch (e) { + } catch (_e) { // ignore invalid package.json } if (/[/\\]index\.(js|jsx|es6)$/.test(absPath)) { @@ -75,7 +75,7 @@ function getCoreJsModules () { id: path.relative(coreJsRoot, file).replace(/\\/g, '/').replace(/\.js$/, ''), request: file })); - } catch (e) { + } catch (_e) { return []; } } diff --git a/config/bun/generate-html.js b/config/bun/generate-html.js index 8b9869a0..b570ce97 100644 --- a/config/bun/generate-html.js +++ b/config/bun/generate-html.js @@ -23,7 +23,7 @@ function readWebOSTitle (context) { try { const appinfo = JSON.parse(fs.readFileSync(appinfoPath, {encoding: 'utf8'})); if (appinfo.title) return appinfo.title; - } catch (e) { + } catch (_e) { // ignore parse errors } } @@ -31,7 +31,7 @@ function readWebOSTitle (context) { return null; } -function renderHtml ({title, publicPath, scriptSrc, cssHref, isomorphic, externalScripts, externalStyles, customSkin}) { +function renderHtml ({title, scriptSrc, cssHref, isomorphic, externalScripts, externalStyles, customSkin}) { const customSkinHead = customSkin ? getCustomSkinHeadHtml() : ''; const externalCss = (externalStyles || []) .map(href => `\n\t\t`) diff --git a/config/bun/plugins/case-sensitive-enact.js b/config/bun/plugins/case-sensitive-enact.js index 488dcdf4..f2384d31 100644 --- a/config/bun/plugins/case-sensitive-enact.js +++ b/config/bun/plugins/case-sensitive-enact.js @@ -1,7 +1,7 @@ const fs = require('fs'); const path = require('path'); -function createCaseSensitiveEnactPlugin (options = {}) { +function createCaseSensitiveEnactPlugin (_options = {}) { if (process.platform === 'win32' || process.platform === 'darwin') { return null; } @@ -34,11 +34,11 @@ function createCaseSensitiveEnactPlugin (options = {}) { `Cannot resolve path '${args.path}' with different casing than the real path '${real}'.` ); } - } catch (e) { - if (e.code === 'ENOENT') { + } catch (error) { + if (error.code === 'ENOENT') { return undefined; } - throw e; + throw error; } return undefined; diff --git a/config/bun/plugins/less-enact.js b/config/bun/plugins/less-enact.js index 3d264a82..9612433b 100644 --- a/config/bun/plugins/less-enact.js +++ b/config/bun/plugins/less-enact.js @@ -72,6 +72,7 @@ function createLessEnactPlugin (options = {}) { paths: [path.dirname(args.path), path.join(appContext, 'node_modules')], modifyVars: Object.assign({__DEV__: !options.production}, options.accent || {}), javascriptEnabled: true, + rewriteUrls: 'all', plugins: [lessTildePlugin] }); @@ -93,20 +94,21 @@ function createLessEnactPlugin (options = {}) { }); build.onLoad({filter: /\.css$/}, async args => { - if (/\.module\.css$/.test(args.path) || options.forceCSSModules) { - const source = await Bun.file(args.path).text(); - const processed = await postcssPlugin.processCss(source, args.path, true); + const isModule = /\.module\.css$/.test(args.path) || options.forceCSSModules; + const cssSource = await Bun.file(args.path).text(); + const cssProcessed = await postcssPlugin.processCss(cssSource, args.path, isModule); + + if (isModule) { return { loader: 'css', - contents: processed.css, - exports: processed.exports + contents: cssProcessed.css, + exports: cssProcessed.exports }; } - const source = await Bun.file(args.path).text(); - const processed = await postcssPlugin.processCss(source, args.path); + return { loader: 'css', - contents: processed.css + contents: cssProcessed.css }; }); } diff --git a/config/bun/plugins/postcss-enact.js b/config/bun/plugins/postcss-enact.js index 11153733..f1afc5ed 100644 --- a/config/bun/plugins/postcss-enact.js +++ b/config/bun/plugins/postcss-enact.js @@ -7,7 +7,8 @@ const { resolveTildeImport, toCssRelativeImport, parseImportPath, - formatImportParams + formatImportParams, + createPostcssUrlPlugin } = require('./resolve-tilde-import'); function createPostcssImportTildePlugin (appContext = process.cwd()) { @@ -45,6 +46,7 @@ createPostcssImportTildePlugin.postcss = true; function buildPostcssPlugins (options = {}) { return [ createPostcssImportTildePlugin(options.context), + createPostcssUrlPlugin(options.context), options.useTailwind && require('tailwindcss'), require('postcss-flexbugs-fixes'), require('postcss-preset-env')({ @@ -69,7 +71,7 @@ function buildPostcssPlugins (options = {}) { function createPostcssEnactPlugin (options = {}) { return { async processCss (source, filePath, asModule) { - let exports = {}; + let moduleExports = {}; const plugins = [...buildPostcssPlugins(options)]; if (asModule) { @@ -81,15 +83,15 @@ function createPostcssEnactPlugin (options = {}) { '[name]_[local]', name ), - getJSON: (_cssFileName, moduleExports) => { - exports = moduleExports; + getJSON: (_cssFileName, cssExports) => { + moduleExports = cssExports; } }) ); } const result = await postcss(plugins).process(source, {from: filePath}); - return {css: result.css, exports: asModule ? exports : undefined}; + return {css: result.css, exports: asModule ? moduleExports : undefined}; } }; } diff --git a/config/bun/plugins/resolve-enact.js b/config/bun/plugins/resolve-enact.js index e63f0762..ba546d5f 100644 --- a/config/bun/plugins/resolve-enact.js +++ b/config/bun/plugins/resolve-enact.js @@ -1,18 +1,48 @@ const path = require('path'); const fs = require('fs'); +const {resolveAppRootImport} = require('./resolve-tilde-import'); function normalizeBundlerPath (filePath) { return filePath.replace(/\\/g, '/'); } +function normalizeAdditionalModulePaths (paths, context) { + if (!paths) return []; + const list = Array.isArray(paths) ? paths : [paths]; + return list.map(modulePath => path.resolve(context, modulePath)); +} + +function resolveFromModulePaths (request, modulePaths) { + for (const modulePath of modulePaths) { + const resolved = path.join(modulePath, request); + if (fs.existsSync(resolved)) { + return resolved; + } + } + return null; +} + function createResolveEnactPlugin (options = {}) { const context = options.context || process.cwd(); const aliases = options.aliases || {}; + const additionalModulePaths = normalizeAdditionalModulePaths(options.additionalModulePaths, context); return { name: 'enact-resolve', setup (build) { build.onResolve({filter: /.*/}, args => { + const appRootPath = resolveAppRootImport(args.path, context); + if (appRootPath) { + return {path: normalizeBundlerPath(appRootPath)}; + } + + if (!args.path.startsWith('.') && !path.isAbsolute(args.path)) { + const fromModulePaths = resolveFromModulePaths(args.path, additionalModulePaths); + if (fromModulePaths) { + return {path: normalizeBundlerPath(fromModulePaths)}; + } + } + for (const [key, target] of Object.entries(aliases)) { if (args.path === key) { let resolved = target; @@ -21,7 +51,7 @@ function createResolveEnactPlugin (options = {}) { } else { try { resolved = require.resolve(target, {paths: [context, args.importer].filter(Boolean)}); - } catch (e) { + } catch (_e) { return undefined; } } @@ -36,7 +66,7 @@ function createResolveEnactPlugin (options = {}) { return { path: normalizeBundlerPath(require.resolve(check, {paths: [context, args.importer].filter(Boolean)})) }; - } catch (e) { + } catch (_e) { // continue } } diff --git a/config/bun/plugins/resolve-tilde-import.js b/config/bun/plugins/resolve-tilde-import.js index 07bfcbc1..82eb88ec 100644 --- a/config/bun/plugins/resolve-tilde-import.js +++ b/config/bun/plugins/resolve-tilde-import.js @@ -1,5 +1,23 @@ +const fs = require('fs'); const path = require('path'); +function isExternalUrl (url) { + return /^(?:data:|https?:|\/\/|#)/.test(url); +} + +function isAppRootUrl (url) { + return url.startsWith('/') && !url.startsWith('//'); +} + +function resolveAppRootImport (importPath, appContext = process.cwd()) { + if (!isAppRootUrl(importPath)) { + return null; + } + + const resolvedPath = path.join(appContext, importPath.slice(1)); + return fs.existsSync(resolvedPath) ? resolvedPath : null; +} + function resolveTildeImport (packagePath, fromDir, appContext = process.cwd()) { const searchPaths = [ fromDir, @@ -10,7 +28,7 @@ function resolveTildeImport (packagePath, fromDir, appContext = process.cwd()) { for (const searchPath of searchPaths) { try { return require.resolve(packagePath, {paths: [searchPath]}); - } catch (e) { + } catch (_e) { // try next search path } } @@ -51,9 +69,80 @@ function formatImportParams (params, resolvedRelativePath) { return `"${resolvedRelativePath}"`; } +function parseCssUrls (value) { + const urls = []; + const pattern = /url\(\s*(['"]?)([^'")]+)\1\s*\)/gi; + let match; + + while ((match = pattern.exec(value)) !== null) { + urls.push({ + full: match[0], + quote: match[1], + url: match[2], + index: match.index + }); + } + + return urls; +} + +function resolveCssUrlPath (url, fromDir) { + if (isExternalUrl(url) || isAppRootUrl(url)) { + return null; + } + + const resolvedPath = path.resolve(fromDir, url); + if (fs.existsSync(resolvedPath)) { + return toCssRelativeImport(fromDir, resolvedPath); + } + + return null; +} + +function rewriteCssUrls (value, fromDir) { + const urls = parseCssUrls(value); + if (!urls.length) { + return value; + } + + let result = value; + for (let i = urls.length - 1; i >= 0; i--) { + const {full, url} = urls[i]; + const rewritten = resolveCssUrlPath(url, fromDir); + if (rewritten && rewritten !== url) { + result = result.slice(0, urls[i].index) + + `url("${rewritten}")` + + result.slice(urls[i].index + full.length); + } + } + + return result; +} + +function createPostcssUrlPlugin (appContext = process.cwd()) { + return { + postcssPlugin: 'postcss-enact-url', + Declaration (decl) { + if (!decl.value.includes('url(')) { + return; + } + + const inputFile = decl.source?.input?.file || appContext; + decl.value = rewriteCssUrls(decl.value, path.dirname(inputFile)); + } + }; +} +createPostcssUrlPlugin.postcss = true; + module.exports = { resolveTildeImport, toCssRelativeImport, parseImportPath, - formatImportParams + formatImportParams, + isExternalUrl, + isAppRootUrl, + resolveAppRootImport, + resolveCssUrlPath, + rewriteCssUrls, + createPostcssUrlPlugin }; diff --git a/config/bun/plugins/snapshot-enact.js b/config/bun/plugins/snapshot-enact.js index fc6de4cc..b433f3b7 100644 --- a/config/bun/plugins/snapshot-enact.js +++ b/config/bun/plugins/snapshot-enact.js @@ -16,7 +16,7 @@ function resolveSnapshotHelper (name) { try { return require.resolve(`@enact/dev-utils/plugins/SnapshotPlugin/${name}`); - } catch (e) { + } catch (_e) { resolveDevUtilsModule(`plugins/SnapshotPlugin/${name}`); throw new Error(`Unable to resolve SnapshotPlugin helper: ${name}`); } diff --git a/config/bun/plugins/typescript-enact.js b/config/bun/plugins/typescript-enact.js index e0f2b48d..6703e7be 100644 --- a/config/bun/plugins/typescript-enact.js +++ b/config/bun/plugins/typescript-enact.js @@ -25,7 +25,7 @@ function runTypeCheck (context) { let ts; try { ts = require(require.resolve('typescript', {paths: [context, __dirname]})); - } catch (e) { + } catch (_e) { return Promise.resolve(); } diff --git a/config/bun/prerender.js b/config/bun/prerender.js index 8c41c0f8..e2fb69a7 100644 --- a/config/bun/prerender.js +++ b/config/bun/prerender.js @@ -6,7 +6,7 @@ function resolveApplyBunPostBuild () { if (typeof PrerenderPlugin.applyBunPostBuild === 'function') { return PrerenderPlugin.applyBunPostBuild; } - } catch (e) { + } catch (_e) { // continue } diff --git a/config/bun/resolve-bun.js b/config/bun/resolve-bun.js index d34ae4c7..e3a9721c 100644 --- a/config/bun/resolve-bun.js +++ b/config/bun/resolve-bun.js @@ -53,7 +53,7 @@ function resolveOvenBun () { if (fs.existsSync(resolved)) { return resolved; } - } catch (err) { + } catch (_err) { // optional platform package not installed } } diff --git a/config/bun/resolve-dev-utils.js b/config/bun/resolve-dev-utils.js index 541b0942..942a446a 100644 --- a/config/bun/resolve-dev-utils.js +++ b/config/bun/resolve-dev-utils.js @@ -21,7 +21,7 @@ function resolveModulePath (basePath) { function resolveDevUtilsModule (subpath) { try { return require(`@enact/dev-utils/${subpath}`); - } catch (e) { + } catch (_e) { // continue } @@ -32,7 +32,7 @@ function resolveDevUtilsModule (subpath) { if (resolved) { return require(resolved); } - } catch (e) { + } catch (_e) { // continue } diff --git a/config/bun/webos-meta.js b/config/bun/webos-meta.js index eeeb30a7..e90426ce 100644 --- a/config/bun/webos-meta.js +++ b/config/bun/webos-meta.js @@ -22,7 +22,7 @@ function readAppInfo (file) { if (!fs.existsSync(file)) return null; try { return JSON.parse(fs.readFileSync(file, {encoding: 'utf8'})); - } catch (e) { + } catch (_e) { console.log('ERROR: unable to read/parse appinfo.json at ' + file); return null; } diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 00000000..fbbb5946 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,36 @@ +const strict = require('eslint-config-enact/strict'); +const globals = require('globals'); + +const bunGlobals = { + ...globals.node, + Bun: 'readonly' +}; + +const bunRules = { + 'no-console': 'off', + 'no-nested-ternary': 'off', + 'no-undefined': 'off', + 'operator-linebreak': 'off', + 'radix': 'off', + 'no-unused-vars': ['error', { + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + caughtErrorsIgnorePattern: '^_' + }], + 'no-shadow': ['error', { + builtinGlobals: false, + hoist: 'all', + allow: ['context', 'require', 'exports'] + }] +}; + +module.exports = [ + ...strict, + { + files: ['config/bun/**/*.{js,mjs}'], + languageOptions: { + globals: bunGlobals + }, + rules: bunRules + } +]; diff --git a/package.json b/package.json index f7472517..1c42dea6 100644 --- a/package.json +++ b/package.json @@ -21,8 +21,8 @@ "access": "public" }, "scripts": { - "lint": "enact lint --strict", - "fix": "enact lint --strict --fix" + "lint": "eslint .", + "fix": "eslint . --fix" }, "prettier": { "printWidth": 120, From 7574878ceba5239337d91b3e765d83029ea8c041 Mon Sep 17 00:00:00 2001 From: Dan Ichim Date: Mon, 13 Jul 2026 17:43:53 +0300 Subject: [PATCH 05/20] isomorphic issue --- config/bun/plugins/less-enact.js | 59 ++++++++-------------- config/bun/plugins/resolve-tilde-import.js | 47 +++++++++++++++-- 2 files changed, 63 insertions(+), 43 deletions(-) diff --git a/config/bun/plugins/less-enact.js b/config/bun/plugins/less-enact.js index 9612433b..94c9b0a6 100644 --- a/config/bun/plugins/less-enact.js +++ b/config/bun/plugins/less-enact.js @@ -37,6 +37,20 @@ async function compileSass (source, filePath) { return result.css; } +function createCssLoadResult (filePath, processed, moduleMode) { + const result = { + loader: 'css', + contents: processed.css, + resolveDir: path.dirname(filePath) + }; + + if (moduleMode) { + result.exports = processed.exports; + } + + return result; +} + function createLessEnactPlugin (options = {}) { const postcssPlugin = createPostcssEnactPlugin(options); const appContext = options.context || process.cwd(); @@ -51,18 +65,7 @@ function createLessEnactPlugin (options = {}) { const moduleMode = isModuleStylesheet(args.path, options.forceCSSModules); const processed = await postcssPlugin.processCss(css, args.path, moduleMode); - if (moduleMode) { - return { - loader: 'css', - contents: processed.css, - exports: processed.exports - }; - } - - return { - loader: 'css', - contents: processed.css - }; + return createCssLoadResult(args.path, processed, moduleMode); }); build.onLoad({filter: /\.less$/}, async args => { @@ -79,37 +82,15 @@ function createLessEnactPlugin (options = {}) { const moduleMode = isModuleStylesheet(args.path, options.forceCSSModules); const processed = await postcssPlugin.processCss(lessResult.css, args.path, moduleMode); - if (moduleMode) { - return { - loader: 'css', - contents: processed.css, - exports: processed.exports - }; - } - - return { - loader: 'css', - contents: processed.css - }; + return createCssLoadResult(args.path, processed, moduleMode); }); build.onLoad({filter: /\.css$/}, async args => { - const isModule = /\.module\.css$/.test(args.path) || options.forceCSSModules; + const moduleMode = /\.module\.css$/.test(args.path) || options.forceCSSModules; const cssSource = await Bun.file(args.path).text(); - const cssProcessed = await postcssPlugin.processCss(cssSource, args.path, isModule); - - if (isModule) { - return { - loader: 'css', - contents: cssProcessed.css, - exports: cssProcessed.exports - }; - } - - return { - loader: 'css', - contents: cssProcessed.css - }; + const cssProcessed = await postcssPlugin.processCss(cssSource, args.path, moduleMode); + + return createCssLoadResult(args.path, cssProcessed, moduleMode); }); } }; diff --git a/config/bun/plugins/resolve-tilde-import.js b/config/bun/plugins/resolve-tilde-import.js index 82eb88ec..6ccc9383 100644 --- a/config/bun/plugins/resolve-tilde-import.js +++ b/config/bun/plugins/resolve-tilde-import.js @@ -86,19 +86,57 @@ function parseCssUrls (value) { return urls; } -function resolveCssUrlPath (url, fromDir) { +function normalizeCssUrlPath (url) { + return url.replace(/\\/g, '/').split(/[?#]/)[0]; +} + +function resolveCssAssetPath (url, fromDir) { if (isExternalUrl(url) || isAppRootUrl(url)) { return null; } - const resolvedPath = path.resolve(fromDir, url); - if (fs.existsSync(resolvedPath)) { - return toCssRelativeImport(fromDir, resolvedPath); + const directPath = path.resolve(fromDir, url); + if (fs.existsSync(directPath)) { + return directPath; + } + + // LESS keeps url() paths relative to the file where they were authored, even + // after those sheets are imported elsewhere (e.g. fonts.less -> ThemeDecorator). + const segments = normalizeCssUrlPath(url).split('/').filter(Boolean); + while (segments[0] === '..') { + segments.shift(); + } + + if (!segments.length) { + return null; + } + + const tailPath = segments.join('/'); + let searchDir = fromDir; + while (searchDir !== path.dirname(searchDir)) { + const candidate = path.join(searchDir, tailPath); + if (fs.existsSync(candidate)) { + return candidate; + } + searchDir = path.dirname(searchDir); } return null; } +function toBundlerCssUrl (filePath) { + return filePath.replace(/\\/g, '/'); +} + +function resolveCssUrlPath (url, fromDir) { + const resolvedPath = resolveCssAssetPath(url, fromDir); + if (!resolvedPath) { + return null; + } + + return toBundlerCssUrl(resolvedPath); +} + function rewriteCssUrls (value, fromDir) { const urls = parseCssUrls(value); if (!urls.length) { @@ -142,6 +180,7 @@ module.exports = { isExternalUrl, isAppRootUrl, resolveAppRootImport, + resolveCssAssetPath, resolveCssUrlPath, rewriteCssUrls, createPostcssUrlPlugin From 6905524e5c4389783feaf2829b4f1a9c9c9d375e Mon Sep 17 00:00:00 2001 From: Dan Ichim Date: Mon, 13 Jul 2026 18:15:13 +0300 Subject: [PATCH 06/20] fix all samples --- config/bun/plugins/babel-enact.js | 3 ++- config/bun/plugins/resolve-enact.js | 38 +++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/config/bun/plugins/babel-enact.js b/config/bun/plugins/babel-enact.js index 62d886d6..807d9ec1 100644 --- a/config/bun/plugins/babel-enact.js +++ b/config/bun/plugins/babel-enact.js @@ -34,7 +34,8 @@ function createBabelEnactPlugin (options = {}) { return { loader, - contents: result.code + contents: result.code, + resolveDir: path.dirname(args.path) }; }); } diff --git a/config/bun/plugins/resolve-enact.js b/config/bun/plugins/resolve-enact.js index ba546d5f..e6afef33 100644 --- a/config/bun/plugins/resolve-enact.js +++ b/config/bun/plugins/resolve-enact.js @@ -22,6 +22,36 @@ function resolveFromModulePaths (request, modulePaths) { return null; } +function getModuleSearchPaths (args, context, additionalModulePaths) { + const paths = new Set(); + + if (args.resolveDir) { + paths.add(args.resolveDir); + } + if (args.importer) { + paths.add(path.dirname(args.importer)); + } + if (context) { + paths.add(context); + } + for (const modulePath of additionalModulePaths) { + paths.add(modulePath); + } + + return [...paths]; +} + +function resolveNodeModule (request, searchPaths) { + for (const searchPath of searchPaths) { + try { + return require.resolve(request, {paths: [searchPath]}); + } catch (_e) { + // continue + } + } + return null; +} + function createResolveEnactPlugin (options = {}) { const context = options.context || process.cwd(); const aliases = options.aliases || {}; @@ -72,6 +102,14 @@ function createResolveEnactPlugin (options = {}) { } } + if (!args.path.startsWith('.') && !path.isAbsolute(args.path)) { + const searchPaths = getModuleSearchPaths(args, context, additionalModulePaths); + const resolved = resolveNodeModule(args.path, searchPaths); + if (resolved) { + return {path: normalizeBundlerPath(resolved)}; + } + } + return undefined; }); From 6ea16d05154432fea3ce79443adb82b31d07b991 Mon Sep 17 00:00:00 2001 From: Dan Ichim Date: Tue, 14 Jul 2026 10:16:34 +0300 Subject: [PATCH 07/20] fix ilib --- config/bun/build-options.js | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/config/bun/build-options.js b/config/bun/build-options.js index 42abd260..2d90e5e1 100644 --- a/config/bun/build-options.js +++ b/config/bun/build-options.js @@ -145,15 +145,22 @@ function createBuildOptions (opts = {}) { const template = app.template || path.join(__dirname, '..', 'html-template.ejs'); const customSkin = !!(opts.customSkin || usesCustomSkinTemplate(template)); - if (externalsPath && !process.env.ILIB_BASE_PATH) { - const {getFrameworkPublicPath} = require('./externals'); - const frameworkPublicPath = getFrameworkPublicPath(externalsPath, externalsPublic); - if (frameworkPublicPath) { - const ilibInEnact = path.join(frameworkPublicPath, 'node_modules', '@enact', 'i18n', 'ilib'); - const ilibStandalone = path.join(frameworkPublicPath, 'node_modules', 'ilib'); - process.env.ILIB_BASE_PATH = fs.existsSync(path.join(context, 'node_modules', '@enact', 'i18n', 'ilib')) - ? ilibInEnact.replace(/\\/g, '/') - : ilibStandalone.replace(/\\/g, '/'); + if (!process.env.ILIB_BASE_PATH) { + if (externalsPath) { + const {getFrameworkPublicPath} = require('./externals'); + const frameworkPublicPath = getFrameworkPublicPath(externalsPath, externalsPublic); + if (frameworkPublicPath) { + const ilibInEnact = path.join(frameworkPublicPath, 'node_modules', '@enact', 'i18n', 'ilib'); + const ilibStandalone = path.join(frameworkPublicPath, 'node_modules', 'ilib'); + process.env.ILIB_BASE_PATH = fs.existsSync(path.join(context, 'node_modules', '@enact', 'i18n', 'ilib')) + ? ilibInEnact.replace(/\\/g, '/') + : ilibStandalone.replace(/\\/g, '/'); + } + } else if (opts.isomorphic || useSnapshot) { + // Prerender uses FileXHR, which maps bundled ilib URLs back to the filesystem via ILIB_BASE_PATH. + if (defines.ILIB_BASE_PATH) { + process.env.ILIB_BASE_PATH = JSON.parse(defines.ILIB_BASE_PATH); + } } } From 43c76036493ac6db3893b4fff82dc00445b712a9 Mon Sep 17 00:00:00 2001 From: Dan Ichim Date: Tue, 14 Jul 2026 13:19:22 +0300 Subject: [PATCH 08/20] fix path --- config/bun/build-options.js | 2 +- config/bun/plugins/resolve-enact.js | 56 +++++++++++++++++----- config/bun/plugins/resolve-tilde-import.js | 14 +++++- 3 files changed, 57 insertions(+), 15 deletions(-) diff --git a/config/bun/build-options.js b/config/bun/build-options.js index 2d90e5e1..41f912b7 100644 --- a/config/bun/build-options.js +++ b/config/bun/build-options.js @@ -116,7 +116,7 @@ function getDefines (opts = {}) { } function createBuildOptions (opts = {}) { - const context = opts.context || app.context; + const context = path.resolve(opts.context || app.context); loadProjectEnv(context, opts.production); if (opts.snapshot) { diff --git a/config/bun/plugins/resolve-enact.js b/config/bun/plugins/resolve-enact.js index e6afef33..94d2c7aa 100644 --- a/config/bun/plugins/resolve-enact.js +++ b/config/bun/plugins/resolve-enact.js @@ -1,9 +1,24 @@ const path = require('path'); const fs = require('fs'); -const {resolveAppRootImport} = require('./resolve-tilde-import'); +const {resolveAppRootImport, isExternalUrl} = require('./resolve-tilde-import'); function normalizeBundlerPath (filePath) { - return filePath.replace(/\\/g, '/'); + return path.resolve(filePath).replace(/\\/g, '/'); +} + +function toResolveResult (filePath) { + const absolutePath = path.resolve(filePath); + if (!path.isAbsolute(absolutePath)) { + return undefined; + } + + return {path: normalizeBundlerPath(absolutePath)}; +} + +function isNodeBuiltin (request) { + const normalized = request.replace(/^node:/, ''); + const builtins = require('module').builtinModules || []; + return builtins.includes(normalized) || builtins.includes(`node:${normalized}`); } function normalizeAdditionalModulePaths (paths, context) { @@ -53,7 +68,7 @@ function resolveNodeModule (request, searchPaths) { } function createResolveEnactPlugin (options = {}) { - const context = options.context || process.cwd(); + const context = path.resolve(options.context || process.cwd()); const aliases = options.aliases || {}; const additionalModulePaths = normalizeAdditionalModulePaths(options.additionalModulePaths, context); @@ -61,15 +76,34 @@ function createResolveEnactPlugin (options = {}) { name: 'enact-resolve', setup (build) { build.onResolve({filter: /.*/}, args => { + if (isExternalUrl(args.path)) { + return {external: true}; + } + + if (path.isAbsolute(args.path) && fs.existsSync(args.path)) { + return toResolveResult(args.path); + } + + if (args.path.startsWith('.') && args.resolveDir) { + const relativePath = path.resolve(args.resolveDir, args.path); + if (fs.existsSync(relativePath)) { + return toResolveResult(relativePath); + } + } + const appRootPath = resolveAppRootImport(args.path, context); if (appRootPath) { - return {path: normalizeBundlerPath(appRootPath)}; + return toResolveResult(appRootPath); } if (!args.path.startsWith('.') && !path.isAbsolute(args.path)) { + if (isNodeBuiltin(args.path)) { + return undefined; + } + const fromModulePaths = resolveFromModulePaths(args.path, additionalModulePaths); if (fromModulePaths) { - return {path: normalizeBundlerPath(fromModulePaths)}; + return toResolveResult(fromModulePaths); } } @@ -77,7 +111,7 @@ function createResolveEnactPlugin (options = {}) { if (args.path === key) { let resolved = target; if (!path.isAbsolute(target) && !target.startsWith('@')) { - resolved = path.join(context, target); + resolved = path.resolve(context, target); } else { try { resolved = require.resolve(target, {paths: [context, args.importer].filter(Boolean)}); @@ -85,7 +119,7 @@ function createResolveEnactPlugin (options = {}) { return undefined; } } - return {path: normalizeBundlerPath(resolved)}; + return toResolveResult(resolved); } } @@ -93,9 +127,7 @@ function createResolveEnactPlugin (options = {}) { const checks = ['@enact/i18n/ilib', 'ilib']; for (const check of checks) { try { - return { - path: normalizeBundlerPath(require.resolve(check, {paths: [context, args.importer].filter(Boolean)})) - }; + return toResolveResult(require.resolve(check, {paths: [context, args.importer].filter(Boolean)})); } catch (_e) { // continue } @@ -106,7 +138,7 @@ function createResolveEnactPlugin (options = {}) { const searchPaths = getModuleSearchPaths(args, context, additionalModulePaths); const resolved = resolveNodeModule(args.path, searchPaths); if (resolved) { - return {path: normalizeBundlerPath(resolved)}; + return toResolveResult(resolved); } } @@ -122,4 +154,4 @@ function createResolveEnactPlugin (options = {}) { }; } -module.exports = {createResolveEnactPlugin, normalizeBundlerPath}; +module.exports = {createResolveEnactPlugin, normalizeBundlerPath, toResolveResult}; diff --git a/config/bun/plugins/resolve-tilde-import.js b/config/bun/plugins/resolve-tilde-import.js index 6ccc9383..612b51d5 100644 --- a/config/bun/plugins/resolve-tilde-import.js +++ b/config/bun/plugins/resolve-tilde-import.js @@ -6,7 +6,17 @@ function isExternalUrl (url) { } function isAppRootUrl (url) { - return url.startsWith('/') && !url.startsWith('//'); + if (!url.startsWith('/') || url.startsWith('//')) { + return false; + } + + // PostCSS rewrites asset URLs to absolute filesystem paths on Linux (e.g. + // /home/.../fonts/foo.ttf). Those are not app-root imports like /assets/foo.png. + if (path.isAbsolute(url) && fs.existsSync(url)) { + return false; + } + + return true; } function resolveAppRootImport (importPath, appContext = process.cwd()) { @@ -14,7 +24,7 @@ function resolveAppRootImport (importPath, appContext = process.cwd()) { return null; } - const resolvedPath = path.join(appContext, importPath.slice(1)); + const resolvedPath = path.resolve(appContext, importPath.slice(1)); return fs.existsSync(resolvedPath) ? resolvedPath : null; } From 71032951556fdb75f9d6ffb359567939db69e7d8 Mon Sep 17 00:00:00 2001 From: Dan Ichim Date: Tue, 14 Jul 2026 14:32:36 +0300 Subject: [PATCH 09/20] fix absolute --- config/bun/plugins/resolve-enact.js | 81 +++++++++++++++++++++++++---- 1 file changed, 72 insertions(+), 9 deletions(-) diff --git a/config/bun/plugins/resolve-enact.js b/config/bun/plugins/resolve-enact.js index 94d2c7aa..8217fe9b 100644 --- a/config/bun/plugins/resolve-enact.js +++ b/config/bun/plugins/resolve-enact.js @@ -6,9 +6,64 @@ function normalizeBundlerPath (filePath) { return path.resolve(filePath).replace(/\\/g, '/'); } +const IMPORT_EXTENSIONS = ['.js', '.jsx', '.ts', '.tsx', '.json', '.mjs', '.cjs']; + +function resolveDirectoryEntry (dirPath) { + const pkgPath = path.join(dirPath, 'package.json'); + if (fs.existsSync(pkgPath)) { + try { + const pkg = JSON.parse(fs.readFileSync(pkgPath, {encoding: 'utf8'})); + if (pkg.main) { + const mainPath = resolveImportPath(path.resolve(dirPath, pkg.main)); + if (mainPath) { + return mainPath; + } + } + } catch (_e) { + // continue + } + } + + for (const index of ['index.js', 'index.jsx', 'index.ts', 'index.tsx', 'index.mjs']) { + const indexPath = path.join(dirPath, index); + if (fs.existsSync(indexPath) && fs.statSync(indexPath).isFile()) { + return indexPath; + } + } + + return null; +} + +function resolveImportPath (requestPath) { + const resolved = path.resolve(requestPath); + + if (fs.existsSync(resolved)) { + const stat = fs.statSync(resolved); + if (stat.isFile()) { + return resolved; + } + if (stat.isDirectory()) { + return resolveDirectoryEntry(resolved); + } + } + + for (const ext of IMPORT_EXTENSIONS) { + const withExt = `${resolved}${ext}`; + if (fs.existsSync(withExt) && fs.statSync(withExt).isFile()) { + return withExt; + } + } + + return null; +} + function toResolveResult (filePath) { const absolutePath = path.resolve(filePath); - if (!path.isAbsolute(absolutePath)) { + if ( + !path.isAbsolute(absolutePath) || + !fs.existsSync(absolutePath) || + !fs.statSync(absolutePath).isFile() + ) { return undefined; } @@ -29,8 +84,8 @@ function normalizeAdditionalModulePaths (paths, context) { function resolveFromModulePaths (request, modulePaths) { for (const modulePath of modulePaths) { - const resolved = path.join(modulePath, request); - if (fs.existsSync(resolved)) { + const resolved = resolveImportPath(path.join(modulePath, request)); + if (resolved) { return resolved; } } @@ -80,14 +135,17 @@ function createResolveEnactPlugin (options = {}) { return {external: true}; } - if (path.isAbsolute(args.path) && fs.existsSync(args.path)) { - return toResolveResult(args.path); + if (path.isAbsolute(args.path)) { + const absoluteImport = resolveImportPath(args.path); + if (absoluteImport) { + return toResolveResult(absoluteImport); + } } if (args.path.startsWith('.') && args.resolveDir) { - const relativePath = path.resolve(args.resolveDir, args.path); - if (fs.existsSync(relativePath)) { - return toResolveResult(relativePath); + const relativeImport = resolveImportPath(path.resolve(args.resolveDir, args.path)); + if (relativeImport) { + return toResolveResult(relativeImport); } } @@ -154,4 +212,9 @@ function createResolveEnactPlugin (options = {}) { }; } -module.exports = {createResolveEnactPlugin, normalizeBundlerPath, toResolveResult}; +module.exports = { + createResolveEnactPlugin, + normalizeBundlerPath, + toResolveResult, + resolveImportPath +}; From 9a98f449de34c3ac5775d3368487629ded1eca8a Mon Sep 17 00:00:00 2001 From: Dan Ichim Date: Tue, 14 Jul 2026 15:22:32 +0300 Subject: [PATCH 10/20] fix prerender --- config/bun/build-options.js | 8 +++++++- config/bun/ilib-meta.js | 33 ++++++++++++++++++++++++++++++++- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/config/bun/build-options.js b/config/bun/build-options.js index 41f912b7..e24ac250 100644 --- a/config/bun/build-options.js +++ b/config/bun/build-options.js @@ -157,10 +157,16 @@ function createBuildOptions (opts = {}) { : ilibStandalone.replace(/\\/g, '/'); } } else if (opts.isomorphic || useSnapshot) { - // Prerender uses FileXHR, which maps bundled ilib URLs back to the filesystem via ILIB_BASE_PATH. + // Prerender uses FileXHR, which maps bundled ilib URLs back to the filesystem. + // ILIB_BASE_PATH must match the bundled define; ILIB_FS_PATH is the resolved source tree. if (defines.ILIB_BASE_PATH) { process.env.ILIB_BASE_PATH = JSON.parse(defines.ILIB_BASE_PATH); } + const {resolveIlibFsPath} = require('./ilib-meta'); + const ilibFsPath = resolveIlibFsPath(context); + if (ilibFsPath) { + process.env.ILIB_FS_PATH = ilibFsPath; + } } } diff --git a/config/bun/ilib-meta.js b/config/bun/ilib-meta.js index 571d9520..7bc76423 100644 --- a/config/bun/ilib-meta.js +++ b/config/bun/ilib-meta.js @@ -49,6 +49,37 @@ function findIlibPath (context) { ); } +function resolveIlibFsPath (context) { + const candidates = []; + const fromEnact = packageSearch(context, path.join('@enact', 'i18n', 'ilib')); + const standalone = packageSearch(context, 'ilib'); + + if (fromEnact) candidates.push(fromEnact); + if (standalone && standalone !== fromEnact) candidates.push(standalone); + if (fs.existsSync(path.join(context, 'ilib'))) { + candidates.push('ilib'); + } + + for (const rel of candidates) { + const full = path.join(context, rel); + if (!fs.existsSync(full)) continue; + + const resolved = fs.realpathSync(full).replace(/\\/g, '/'); + if (fs.existsSync(path.join(resolved, 'locale', 'likelylocales.json'))) { + return resolved; + } + } + + for (const rel of candidates) { + const full = path.join(context, rel); + if (fs.existsSync(full)) { + return fs.realpathSync(full).replace(/\\/g, '/'); + } + } + + return null; +} + function readManifestFiles (manifestPath) { if (!fs.existsSync(manifestPath)) return []; const data = JSON.parse(fs.readFileSync(manifestPath, {encoding: 'utf8'})); @@ -157,4 +188,4 @@ function applyIlibResources (context, output, options = {}) { } } -module.exports = {getIlibDefines, applyIlibResources, findIlibPath, bundleConst}; +module.exports = {getIlibDefines, applyIlibResources, findIlibPath, resolveIlibFsPath, bundleConst}; From fe4dd51761fe3673d2b465de5cacec1ce9a1a60b Mon Sep 17 00:00:00 2001 From: Dan Ichim Date: Tue, 14 Jul 2026 16:30:23 +0300 Subject: [PATCH 11/20] fix isomorphic prerender --- config/bun/build-options.js | 36 +++++++++++++++------------- config/bun/ilib-meta.js | 48 ++++++++++++++++++++++++------------- 2 files changed, 50 insertions(+), 34 deletions(-) diff --git a/config/bun/build-options.js b/config/bun/build-options.js index e24ac250..457f553a 100644 --- a/config/bun/build-options.js +++ b/config/bun/build-options.js @@ -145,23 +145,25 @@ function createBuildOptions (opts = {}) { const template = app.template || path.join(__dirname, '..', 'html-template.ejs'); const customSkin = !!(opts.customSkin || usesCustomSkinTemplate(template)); - if (!process.env.ILIB_BASE_PATH) { - if (externalsPath) { - const {getFrameworkPublicPath} = require('./externals'); - const frameworkPublicPath = getFrameworkPublicPath(externalsPath, externalsPublic); - if (frameworkPublicPath) { - const ilibInEnact = path.join(frameworkPublicPath, 'node_modules', '@enact', 'i18n', 'ilib'); - const ilibStandalone = path.join(frameworkPublicPath, 'node_modules', 'ilib'); - process.env.ILIB_BASE_PATH = fs.existsSync(path.join(context, 'node_modules', '@enact', 'i18n', 'ilib')) - ? ilibInEnact.replace(/\\/g, '/') - : ilibStandalone.replace(/\\/g, '/'); - } - } else if (opts.isomorphic || useSnapshot) { - // Prerender uses FileXHR, which maps bundled ilib URLs back to the filesystem. - // ILIB_BASE_PATH must match the bundled define; ILIB_FS_PATH is the resolved source tree. - if (defines.ILIB_BASE_PATH) { - process.env.ILIB_BASE_PATH = JSON.parse(defines.ILIB_BASE_PATH); - } + if (!process.env.ILIB_BASE_PATH && externalsPath) { + const {getFrameworkPublicPath} = require('./externals'); + const frameworkPublicPath = getFrameworkPublicPath(externalsPath, externalsPublic); + if (frameworkPublicPath) { + const ilibInEnact = path.join(frameworkPublicPath, 'node_modules', '@enact', 'i18n', 'ilib'); + const ilibStandalone = path.join(frameworkPublicPath, 'node_modules', 'ilib'); + process.env.ILIB_BASE_PATH = fs.existsSync(path.join(context, 'node_modules', '@enact', 'i18n', 'ilib')) + ? ilibInEnact.replace(/\\/g, '/') + : ilibStandalone.replace(/\\/g, '/'); + } + } + + if (opts.isomorphic || useSnapshot) { + // Prerender uses FileXHR, which maps bundled ilib URLs back to the filesystem. + process.env.ILIB_CONTEXT = context; + if (!process.env.ILIB_BASE_PATH && defines.ILIB_BASE_PATH) { + process.env.ILIB_BASE_PATH = JSON.parse(defines.ILIB_BASE_PATH); + } + if (!process.env.ILIB_FS_PATH) { const {resolveIlibFsPath} = require('./ilib-meta'); const ilibFsPath = resolveIlibFsPath(context); if (ilibFsPath) { diff --git a/config/bun/ilib-meta.js b/config/bun/ilib-meta.js index 7bc76423..d6966525 100644 --- a/config/bun/ilib-meta.js +++ b/config/bun/ilib-meta.js @@ -4,17 +4,22 @@ const glob = require('glob'); const app = require('@enact/dev-utils/option-parser'); function packageSearch (dir, pkg) { - if (!path.isAbsolute(dir)) dir = path.join(process.cwd(), dir); + const root = path.isAbsolute(dir) ? dir : path.join(process.cwd(), dir); + dir = root; while (dir.length > 0 && dir !== path.dirname(dir)) { const full = path.join(dir, 'node_modules', pkg); if (fs.existsSync(full)) { - return path.relative(process.cwd(), full).replace(/\\/g, '/'); + return path.relative(root, full).replace(/\\/g, '/'); } dir = path.dirname(dir); } return null; } +function hasLocaleMatchJson (ilibPath) { + return fs.existsSync(path.join(ilibPath, 'locale', 'localematch.json')); +} + function transformPath (context, file) { return path .relative(context, file) @@ -30,11 +35,18 @@ function bundleConst (name) { ); } -function resolveBundlePath ({dir, context, publicPath, relative}) { +function resolveBundlePath ({dir, context, publicPath, relative, symlinks = true}) { if (path.isAbsolute(dir)) { return JSON.stringify(dir.replace(/\\/g, '/')); } - const full = fs.existsSync(path.join(context, dir)) ? path.join(context, dir) : dir; + let full = path.join(context, dir); + if (fs.existsSync(full)) { + if (symlinks) { + full = fs.realpathSync(full); + } + } else { + full = dir; + } if (relative) { return JSON.stringify(transformPath(context, full)); } @@ -42,11 +54,20 @@ function resolveBundlePath ({dir, context, publicPath, relative}) { } function findIlibPath (context) { - return ( - packageSearch(context, path.join('@enact', 'i18n', 'ilib')) || - packageSearch(context, 'ilib') || - (fs.existsSync(path.join(context, 'ilib')) && 'ilib') - ); + const candidates = [ + packageSearch(context, path.join('@enact', 'i18n', 'ilib')), + packageSearch(context, 'ilib'), + fs.existsSync(path.join(context, 'ilib')) && 'ilib' + ].filter(Boolean); + + for (const rel of candidates) { + const full = path.join(context, rel); + if (fs.existsSync(full) && hasLocaleMatchJson(fs.realpathSync(full))) { + return rel; + } + } + + return candidates[0] || null; } function resolveIlibFsPath (context) { @@ -65,18 +86,11 @@ function resolveIlibFsPath (context) { if (!fs.existsSync(full)) continue; const resolved = fs.realpathSync(full).replace(/\\/g, '/'); - if (fs.existsSync(path.join(resolved, 'locale', 'likelylocales.json'))) { + if (hasLocaleMatchJson(resolved)) { return resolved; } } - for (const rel of candidates) { - const full = path.join(context, rel); - if (fs.existsSync(full)) { - return fs.realpathSync(full).replace(/\\/g, '/'); - } - } - return null; } From 9bfd1c94a4b0c3897ef5b41dd2cba7c11ed5a7ad Mon Sep 17 00:00:00 2001 From: Dan Ichim Date: Tue, 14 Jul 2026 21:59:59 +0300 Subject: [PATCH 12/20] path iso tv locale --- config/bun/build-options.js | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/config/bun/build-options.js b/config/bun/build-options.js index 457f553a..f5bfdb49 100644 --- a/config/bun/build-options.js +++ b/config/bun/build-options.js @@ -160,15 +160,13 @@ function createBuildOptions (opts = {}) { if (opts.isomorphic || useSnapshot) { // Prerender uses FileXHR, which maps bundled ilib URLs back to the filesystem. process.env.ILIB_CONTEXT = context; - if (!process.env.ILIB_BASE_PATH && defines.ILIB_BASE_PATH) { + if (defines.ILIB_BASE_PATH) { process.env.ILIB_BASE_PATH = JSON.parse(defines.ILIB_BASE_PATH); } - if (!process.env.ILIB_FS_PATH) { - const {resolveIlibFsPath} = require('./ilib-meta'); - const ilibFsPath = resolveIlibFsPath(context); - if (ilibFsPath) { - process.env.ILIB_FS_PATH = ilibFsPath; - } + const {resolveIlibFsPath} = require('./ilib-meta'); + const ilibFsPath = resolveIlibFsPath(context); + if (ilibFsPath) { + process.env.ILIB_FS_PATH = ilibFsPath; } } From 6db3b0855f2cf39de3c986a54ba760379f47da2d Mon Sep 17 00:00:00 2001 From: Dan Ichim Date: Wed, 15 Jul 2026 12:56:13 +0300 Subject: [PATCH 13/20] fix ilib --- config/bun/build.mjs | 55 ++++++++++++++++++++-------- config/bun/compare-bundles.js | 30 +++++++++++++++ config/bun/prerender-worker.cjs | 37 +++++++++++++++++++ config/bun/run-prerender-in-node.cjs | 51 ++++++++++++++++++++++++++ config/bun/spawn.js | 2 +- 5 files changed, 158 insertions(+), 17 deletions(-) create mode 100644 config/bun/compare-bundles.js create mode 100644 config/bun/prerender-worker.cjs create mode 100644 config/bun/run-prerender-in-node.cjs diff --git a/config/bun/build.mjs b/config/bun/build.mjs index a58f8002..18d7dbea 100644 --- a/config/bun/build.mjs +++ b/config/bun/build.mjs @@ -28,7 +28,8 @@ function parseArgs (argv) { customSkin: false, linting: true, splitCss: true, - externalsPolyfill: false + externalsPolyfill: false, + prerenderOnly: false }; for (let i = 0; i < argv.length; i++) { const arg = argv[i]; @@ -51,6 +52,7 @@ function parseArgs (argv) { else if (arg === '--externals') opts.externals = argv[++i]; else if (arg === '--externals-public') opts.externalsPublic = argv[++i]; else if (arg === '--custom-skin') opts.customSkin = true; + else if (arg === '--prerender-only') opts.prerenderOnly = true; else if (arg === '--context') opts.context = argv[++i]; } return opts; @@ -139,6 +141,29 @@ function getStartupAssets (publicPath, jsName, buildOpts) { return assets; } +function getPrerenderPayload (options, buildOpts, jsName) { + const app = nodeRequire('@enact/dev-utils/option-parser'); + return { + context: options.context, + output: options.outputPath, + chunk: jsName, + locales: buildOpts.locales || 'en-US', + publicPath: options.publicPath, + screenTypes: app.screenTypes, + deep: app.deep, + fontGenerator: app.fontGenerator, + externalStartup: app.externalStartup, + externals: buildOpts.externals, + startupAssets: getStartupAssets(options.publicPath, jsName, buildOpts) + }; +} + +function runIsomorphicPrerender (options, buildOpts, jsName) { + nodeRequire('./run-prerender-in-node.cjs').runPrerenderInNode( + getPrerenderPayload(options, buildOpts, jsName) + ); +} + async function buildReactGlobals (options, _buildOpts) { const globalsEntry = path.join(path.dirname(fileURLToPath(import.meta.url)), 'react-globals-entry.js'); const result = await Bun.build({ @@ -198,21 +223,7 @@ function finalizeBuild (result, buildOpts, options) { }); if (buildOpts.isomorphic) { - const app = nodeRequire('@enact/dev-utils/option-parser'); - const applyBunPostBuild = nodeRequire('./prerender.js').applyPrerender; - applyBunPostBuild({ - context: options.context, - output: options.outputPath, - chunk: jsName, - locales: buildOpts.locales || 'en-US', - publicPath: options.publicPath, - screenTypes: app.screenTypes, - deep: app.deep, - fontGenerator: app.fontGenerator, - externalStartup: app.externalStartup, - externals: buildOpts.externals, - startupAssets: getStartupAssets(options.publicPath, jsName, buildOpts) - }); + runIsomorphicPrerender(options, buildOpts, jsName); } let v8SnapshotFile; @@ -258,11 +269,23 @@ function logBuildResult (buildOpts, options, info) { })); } +async function runPrerenderOnly (buildOpts) { + buildOpts.isomorphic = true; + const options = createBuildOptions(buildOpts); + const jsName = buildOpts.chunk || 'main.js'; + runIsomorphicPrerender(options, buildOpts, jsName); + console.log(JSON.stringify({success: true, prerenderOnly: true, locales: buildOpts.locales})); +} + async function runBuild (buildOpts) { if (buildOpts.snapshot) { buildOpts.isomorphic = true; } + if (buildOpts.prerenderOnly) { + return runPrerenderOnly(buildOpts); + } + const options = createBuildOptions(buildOpts); const polyfillPath = options.externalsPolyfill ? path.join(path.dirname(fileURLToPath(import.meta.url)), '..', 'polyfills.js') diff --git a/config/bun/compare-bundles.js b/config/bun/compare-bundles.js new file mode 100644 index 00000000..3a7a363b --- /dev/null +++ b/config/bun/compare-bundles.js @@ -0,0 +1,30 @@ +#!/usr/bin/env node +'use strict'; + +const fs = require('fs'); +const path = require('path'); + +const a = fs.readFileSync(process.argv[2], 'utf8'); +const b = fs.readFileSync(process.argv[3], 'utf8'); + +console.log('lengths', a.length, b.length); +const ca = a.match(/cacheID = "(\d+)"/); +const cb = b.match(/cacheID = "(\d+)"/); +console.log('cacheID', ca && ca[1], cb && cb[1]); + +let diffCount = 0; +let firstDiff = -1; +for (let i = 0; i < Math.min(a.length, b.length); i++) { + if (a[i] !== b[i]) { + diffCount++; + if (firstDiff === -1) firstDiff = i; + } +} +console.log('diff chars', diffCount + (a.length !== b.length ? ' (length mismatch)' : '')); +if (firstDiff >= 0) { + console.log('first diff context A:', JSON.stringify(a.slice(Math.max(0, firstDiff - 40), firstDiff + 40))); + console.log('first diff context B:', JSON.stringify(b.slice(Math.max(0, firstDiff - 40), firstDiff + 40))); +} + +const stripCache = s => s.replace(/cacheID = "\d+"/g, 'cacheID = "X"'); +console.log('identical except cacheID?', stripCache(a) === stripCache(b)); diff --git a/config/bun/prerender-worker.cjs b/config/bun/prerender-worker.cjs new file mode 100644 index 00000000..06b9ee1b --- /dev/null +++ b/config/bun/prerender-worker.cjs @@ -0,0 +1,37 @@ +'use strict'; + +const fs = require('fs'); +const path = require('path'); + +const optionsFile = process.argv[2]; +if (!optionsFile) { + console.error('Missing prerender options file'); + process.exit(1); +} + +const prerenderOpts = JSON.parse(fs.readFileSync(optionsFile, 'utf8')); +const bunDir = __dirname; + +process.chdir(prerenderOpts.context); + +const appModules = path.join(prerenderOpts.context, 'node_modules'); +if (fs.existsSync(appModules)) { + module.paths.unshift(appModules); +} + +const {createBuildOptions} = require(path.join(bunDir, 'build-options')); +const {applyPrerender} = require(path.join(bunDir, 'prerender')); + +createBuildOptions({ + isomorphic: true, + context: prerenderOpts.context, + output: prerenderOpts.output, + externals: prerenderOpts.externals +}); + +try { + applyPrerender(prerenderOpts); +} catch (e) { + console.error(e.stack || e.message || e); + process.exit(1); +} diff --git a/config/bun/run-prerender-in-node.cjs b/config/bun/run-prerender-in-node.cjs new file mode 100644 index 00000000..85349bba --- /dev/null +++ b/config/bun/run-prerender-in-node.cjs @@ -0,0 +1,51 @@ +'use strict'; + +const {spawnSync} = require('child_process'); +const fs = require('fs'); +const path = require('path'); +const os = require('os'); + +function resolveNodeExecutable () { + const candidates = [ + process.env.ENACT_NODE, + process.env.npm_node_execpath, + process.env.NODE_BINARY + ].filter(Boolean); + + for (const candidate of candidates) { + if (!/bun/i.test(path.basename(candidate))) { + return candidate; + } + } + + return 'node'; +} + +function runPrerenderInNode (prerenderOpts) { + const node = resolveNodeExecutable(); + const worker = path.join(__dirname, 'prerender-worker.cjs'); + const optsFile = path.join(os.tmpdir(), `enact-prerender-${process.pid}-${Date.now()}.json`); + + fs.writeFileSync(optsFile, JSON.stringify(prerenderOpts), 'utf8'); + + const result = spawnSync(node, [worker, optsFile], { + stdio: 'inherit', + cwd: prerenderOpts.context, + env: process.env + }); + + try { + fs.unlinkSync(optsFile); + } catch (_e) { + // ignore cleanup errors + } + + if (result.error) { + throw result.error; + } + if (result.status !== 0) { + process.exit(result.status === null ? 1 : result.status); + } +} + +module.exports = {runPrerenderInNode}; diff --git a/config/bun/spawn.js b/config/bun/spawn.js index 5e84b628..8f302d49 100644 --- a/config/bun/spawn.js +++ b/config/bun/spawn.js @@ -8,7 +8,7 @@ function spawnBunScript (script, args = [], opts = {}) { const spawnOpts = { stdio: 'inherit', cwd: opts.cwd || process.cwd(), - env: {...process.env, ...opts.env} + env: {...process.env, ENACT_NODE: process.execPath, ...opts.env} }; return new Promise((resolve, reject) => { From fa855c8e1d5d33534b6cc20dddad8b0bfb128828 Mon Sep 17 00:00:00 2001 From: Dan Ichim Date: Wed, 15 Jul 2026 14:18:03 +0300 Subject: [PATCH 14/20] fix lint --- config/bun/compare-bundles.js | 1 - eslint.config.js | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/config/bun/compare-bundles.js b/config/bun/compare-bundles.js index 3a7a363b..256a31cd 100644 --- a/config/bun/compare-bundles.js +++ b/config/bun/compare-bundles.js @@ -2,7 +2,6 @@ 'use strict'; const fs = require('fs'); -const path = require('path'); const a = fs.readFileSync(process.argv[2], 'utf8'); const b = fs.readFileSync(process.argv[3], 'utf8'); diff --git a/eslint.config.js b/eslint.config.js index fbbb5946..8b36fb89 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -27,7 +27,7 @@ const bunRules = { module.exports = [ ...strict, { - files: ['config/bun/**/*.{js,mjs}'], + files: ['config/bun/**/*.{js,mjs,cjs}'], languageOptions: { globals: bunGlobals }, From f6eb7a34b44e868b015bfa63248501004bdf8680 Mon Sep 17 00:00:00 2001 From: Dan Ichim Date: Wed, 15 Jul 2026 17:06:03 +0300 Subject: [PATCH 15/20] framework fix --- commands/pack.js | 3 + config/bun/build-framework.mjs | 3 +- config/bun/build-options.js | 14 ++++ config/bun/build.mjs | 15 ++-- config/bun/framework.js | 52 +++++++++++-- config/bun/plugins/framework-exclusions.js | 86 ++++++++++++++++++++++ config/bun/plugins/index.js | 6 ++ config/bun/plugins/less-enact.js | 32 +++++++- 8 files changed, 196 insertions(+), 15 deletions(-) create mode 100644 config/bun/plugins/framework-exclusions.js diff --git a/commands/pack.js b/commands/pack.js index fd347bac..65f3cc20 100755 --- a/commands/pack.js +++ b/commands/pack.js @@ -102,6 +102,9 @@ function buildArgs (opts) { if (opts.entry) args.push('--entry', opts.entry); if (opts['ilib-additional-path']) args.push('--ilib-additional-path', opts['ilib-additional-path']); if (opts['custom-skin']) args.push('--custom-skin'); + if (opts.meta) { + args.push('--meta', typeof opts.meta === 'string' ? opts.meta : JSON.stringify(opts.meta)); + } return args; } diff --git a/config/bun/build-framework.mjs b/config/bun/build-framework.mjs index 8ee283fb..84ba91aa 100644 --- a/config/bun/build-framework.mjs +++ b/config/bun/build-framework.mjs @@ -44,7 +44,8 @@ async function run () { useTailwind: options.useTailwind, ri: options.ri, aliases: options.aliases, - linting: options.linting + linting: options.linting, + framework: true }); const output = await applyFramework({ diff --git a/config/bun/build-options.js b/config/bun/build-options.js index f5bfdb49..0ce63fcc 100644 --- a/config/bun/build-options.js +++ b/config/bun/build-options.js @@ -115,9 +115,23 @@ function getDefines (opts = {}) { return defines; } +function applyMetaOverride (meta) { + if (!meta) return; + let parsed = meta; + if (typeof parsed === 'string') { + try { + parsed = JSON.parse(parsed); + } catch (e) { + throw new Error('Invalid metadata; must be a valid JSON string.\n' + e.message); + } + } + app.applyEnactMeta(parsed); +} + function createBuildOptions (opts = {}) { const context = path.resolve(opts.context || app.context); loadProjectEnv(context, opts.production); + applyMetaOverride(opts.meta); if (opts.snapshot) { opts.isomorphic = true; diff --git a/config/bun/build.mjs b/config/bun/build.mjs index 18d7dbea..bf3341ab 100644 --- a/config/bun/build.mjs +++ b/config/bun/build.mjs @@ -52,6 +52,7 @@ function parseArgs (argv) { else if (arg === '--externals') opts.externals = argv[++i]; else if (arg === '--externals-public') opts.externalsPublic = argv[++i]; else if (arg === '--custom-skin') opts.customSkin = true; + else if (arg === '--meta' || arg === '-m') opts.meta = argv[++i]; else if (arg === '--prerender-only') opts.prerenderOnly = true; else if (arg === '--context') opts.context = argv[++i]; } @@ -203,6 +204,13 @@ function finalizeBuild (result, buildOpts, options) { } } + nodeRequire('./post-build.js').applyPostBuild(options.context, options.outputPath, { + publicPath: options.publicPath, + ilibAdditionalResourcesPath: options.ilibAdditionalResourcesPath, + customSkin: options.customSkin, + watch: buildOpts.watch + }); + writeIndexHtml(options.outputPath, { title: options.title, context: options.context, @@ -215,13 +223,6 @@ function finalizeBuild (result, buildOpts, options) { externalStyles: externalAssets?.styles }); - nodeRequire('./post-build.js').applyPostBuild(options.context, options.outputPath, { - publicPath: options.publicPath, - ilibAdditionalResourcesPath: options.ilibAdditionalResourcesPath, - customSkin: options.customSkin, - watch: buildOpts.watch - }); - if (buildOpts.isomorphic) { runIsomorphicPrerender(options, buildOpts, jsName); } diff --git a/config/bun/framework.js b/config/bun/framework.js index efcca0d3..2030f709 100644 --- a/config/bun/framework.js +++ b/config/bun/framework.js @@ -5,6 +5,7 @@ const fastGlob = require(require.resolve('fast-glob', { paths: [path.dirname(require.resolve('@enact/dev-utils/package.json'))] })); const packageRoot = require('@enact/dev-utils/package-root'); +const {shouldExcludePath} = require('./plugins/framework-exclusions'); const ROOT_PACKAGES = [ 'react', @@ -26,10 +27,30 @@ const FRAMEWORK_IGNORE = [ '**/@enact/storybook-utils/**/*.*', '**/@enact/ui-test-utils/**/*.*', '**/@enact/screenshot-test-utils/**/*.*', + '**/ilib/localedata/**/*.*', + '**/node_modules/**/*.*', '**/samples/**/*.*', - '**/tests/**/*.*' + '**/tests/**/*.*', + '**/ilib-node*.js', + '**/AsyncNodeLoader.js', + '**/NodeLoader.js', + '**/RhinoLoader.js', + '**/react-dom/cjs/react-dom-server.node.*' ]; +const ILIB_IGNORE = [ + '!node_modules', + '!locale', + '**/ilib-node*.js', + '**/AsyncNodeLoader.js', + '**/NodeLoader.js', + '**/RhinoLoader.js' +]; + +function isFrameworkModuleFile (file) { + return !/(^|[/\\])test[/\\]|\.test\.(js|jsx|es6)$|[-.]specs?\.(js|jsx|es6)$|\.bak(?:\.|\/|\\)/.test(file); +} + function getModuleId (nodeModules, file) { const absPath = path.join(nodeModules, file); let dir = absPath; @@ -108,16 +129,20 @@ function getThemeLocalModules (context) { '!tests', '**/__tests__/**/*.{js,jsx,ts,tsx}', '**/?(*.)+(spec|test).[jt]s?(x)', - '**/*-specs.{js,jsx,ts,tsx}' + '**/*-specs.{js,jsx,ts,tsx}', + '**/*.bak*/**', + '**/*bak*/**' ] }) .map(file => { const abs = path.resolve(app.path, file); - let id = file.replace(/\.(jsx|es6|js)$/, '').replace(/\\/g, '/'); + let id = './' + file.replace(/\.(jsx|es6|js)$/, '').replace(/\\/g, '/'); if (id.endsWith('/index') && id.length > 6) { id = id.slice(0, -6); } - id = id.replace(/^\.\//, app.meta.name + '/'); + if (id.startsWith('.') && !id.startsWith('..')) { + id = id.replace(/^\./, app.meta.name); + } return {id, request: abs}; }); } @@ -128,14 +153,21 @@ function getFrameworkModuleRequests (context, options = {}) { cwd: nodeModules, onlyFiles: true, ignore: FRAMEWORK_IGNORE, - followSymbolicLinks: true + followSymbolicLinks: false + }); + const ilibFiles = fastGlob.sync('ilib/**/*.@(js|jsx|es6)', { + cwd: nodeModules, + onlyFiles: true, + ignore: ILIB_IGNORE, + followSymbolicLinks: false }); const modules = new Map(); for (const pkg of ROOT_PACKAGES) { modules.set(pkg, pkg); } - for (const file of enactFiles) { + for (const file of enactFiles.concat(ilibFiles)) { + if (!isFrameworkModuleFile(file)) continue; const id = getModuleId(nodeModules, file); if (!modules.has(id)) { modules.set(id, id); @@ -175,11 +207,19 @@ function writeFrameworkEntry (context, modules, options = {}) { } for (const {id, request} of modules) { + const normalizedRequest = String(request).replace(/\\/g, '/'); + if (shouldExcludePath(normalizedRequest)) { + continue; + } lines.push(`__register(${JSON.stringify(id)}, function () { return require(${JSON.stringify(request)}); });`); } lines.push('', '// Eagerly load framework modules for CSS extraction'); for (const {request} of modules) { + const normalizedRequest = String(request).replace(/\\/g, '/'); + if (shouldExcludePath(normalizedRequest)) { + continue; + } lines.push(`require(${JSON.stringify(request)});`); } diff --git a/config/bun/plugins/framework-exclusions.js b/config/bun/plugins/framework-exclusions.js new file mode 100644 index 00000000..315f288a --- /dev/null +++ b/config/bun/plugins/framework-exclusions.js @@ -0,0 +1,86 @@ +const STUB_NAMESPACE = 'enact-framework-stub'; + +const EXCLUDED_PACKAGES = new Set([ + 'tape', + 'async_hooks', + 'vm', + 'node:async_hooks', + 'node:vm' +]); + +const EXCLUDED_PATH_PATTERN = /[/\\]node_modules[/\\][^/\\]+[/\\]test\.js$|[/\\]node_modules[/\\](?:[^/\\]+[/\\])*(?:test|tests)[/\\]|\.test\.(?:js|cjs|mjs)$|[-.]specs?\.(?:js|cjs|mjs)$|react-dom-server\.node|ilib-node(?:-async|-assembled|-dyn)?\.js|AsyncNodeLoader\.js|NodeLoader\.js|RhinoLoader\.js|ilib-full-dyn-compiled\.js/; + +function shouldExcludePath (filePath) { + if (!filePath) return false; + const request = filePath.replace(/\\/g, '/'); + return EXCLUDED_PATH_PATTERN.test(request); +} + +function shouldExcludeFrameworkImport (args) { + const request = args.path.replace(/\\/g, '/'); + + if (EXCLUDED_PACKAGES.has(args.path) || EXCLUDED_PACKAGES.has(request)) { + return true; + } + + if (shouldExcludePath(request)) { + return true; + } + + if (args.importer) { + const importer = args.importer.replace(/\\/g, '/'); + if (shouldExcludePath(importer)) { + return true; + } + } + + return false; +} + +function createFrameworkExclusionsPlugin () { + return { + name: 'enact-framework-exclusions', + setup (build) { + build.onResolve({filter: /^react-dom\/server$/}, () => { + try { + return {path: require.resolve('react-dom/server.browser')}; + } catch (_e) { + return undefined; + } + }); + + build.onResolve({filter: /.*/}, args => { + if (!shouldExcludeFrameworkImport(args)) { + return undefined; + } + + return { + path: args.path, + namespace: STUB_NAMESPACE + }; + }); + + build.onLoad({filter: /.*/, namespace: STUB_NAMESPACE}, () => ({ + contents: 'module.exports = {};', + loader: 'js' + })); + + // Prevent Bun from parsing excluded files reached via absolute require() paths. + build.onLoad({filter: /.*/}, args => { + if (args.namespace !== 'file' || !args.path) { + return undefined; + } + if (shouldExcludePath(args.path)) { + return {contents: 'module.exports = {};', loader: 'js'}; + } + return undefined; + }); + } + }; +} + +module.exports = { + createFrameworkExclusionsPlugin, + shouldExcludeFrameworkImport, + shouldExcludePath +}; diff --git a/config/bun/plugins/index.js b/config/bun/plugins/index.js index 3ee41a48..4190f980 100644 --- a/config/bun/plugins/index.js +++ b/config/bun/plugins/index.js @@ -1,6 +1,7 @@ const {createBabelEnactPlugin} = require('./babel-enact'); const {createLessEnactPlugin} = require('./less-enact'); const {createResolveEnactPlugin} = require('./resolve-enact'); +const {createFrameworkExclusionsPlugin} = require('./framework-exclusions'); const {createExternalsEnactPlugin} = require('./externals-enact'); const {createIsomorphicEnactPlugin} = require('./isomorphic-enact'); const {createEslintEnactPlugin} = require('./eslint-enact'); @@ -11,6 +12,10 @@ const {createTypescriptEnactPlugin} = require('./typescript-enact'); function createEnactPlugins (options = {}) { const plugins = []; + if (options.framework) { + plugins.unshift(createFrameworkExclusionsPlugin()); + } + const eslintPlugin = createEslintEnactPlugin(options); if (eslintPlugin) { plugins.push(eslintPlugin); @@ -55,6 +60,7 @@ module.exports = { createEnactPlugins, createBabelEnactPlugin, createLessEnactPlugin, + createFrameworkExclusionsPlugin, createExternalsEnactPlugin, createIsomorphicEnactPlugin, createEslintEnactPlugin, diff --git a/config/bun/plugins/less-enact.js b/config/bun/plugins/less-enact.js index 94c9b0a6..03d4815a 100644 --- a/config/bun/plugins/less-enact.js +++ b/config/bun/plugins/less-enact.js @@ -1,4 +1,5 @@ const path = require('path'); +const fs = require('fs'); const less = require('less'); const sass = require('sass'); const {createPostcssEnactPlugin} = require('./postcss-enact'); @@ -28,6 +29,35 @@ function createLessTildePlugin (appContext) { }; } +function getLessSearchPaths (filePath, appContext) { + const paths = new Set([ + path.dirname(filePath), + path.join(appContext, 'node_modules') + ]); + + let dir = path.dirname(filePath); + while (dir) { + if ( + fs.existsSync(path.join(dir, 'ThemeDecorator')) || + fs.existsSync(path.join(dir, 'MoonstoneDecorator')) || + fs.existsSync(path.join(dir, 'AgateDecorator')) + ) { + paths.add(dir); + const stylesDir = path.join(dir, 'styles'); + if (fs.existsSync(stylesDir)) { + paths.add(stylesDir); + } + } + const parent = path.dirname(dir); + if (parent === dir) { + break; + } + dir = parent; + } + + return [...paths]; +} + async function compileSass (source, filePath) { const result = sass.compileString(source, { url: new URL(`file:///${filePath.replace(/\\/g, '/')}`), @@ -72,7 +102,7 @@ function createLessEnactPlugin (options = {}) { const source = await Bun.file(args.path).text(); const lessResult = await less.render(source, { filename: args.path, - paths: [path.dirname(args.path), path.join(appContext, 'node_modules')], + paths: getLessSearchPaths(args.path, appContext), modifyVars: Object.assign({__DEV__: !options.production}, options.accent || {}), javascriptEnabled: true, rewriteUrls: 'all', From 6bee478b93bae4b3ff22ed4ceb19cb310f2e7260 Mon Sep 17 00:00:00 2001 From: Dan Ichim Date: Wed, 15 Jul 2026 18:17:39 +0300 Subject: [PATCH 16/20] fallback title --- config/bun/build-options.js | 13 ++++++++++--- config/bun/build.mjs | 6 ++---- config/bun/generate-html.js | 2 +- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/config/bun/build-options.js b/config/bun/build-options.js index 0ce63fcc..229758fd 100644 --- a/config/bun/build-options.js +++ b/config/bun/build-options.js @@ -35,7 +35,7 @@ function getCacheDir (context) { } function ensureEntryFile (context, mainEntry, options = {}) { - const {isomorphic, snapshot, fastRefresh} = options; + const {isomorphic, snapshot, fastRefresh, noAnimation} = options; const cacheDir = getCacheDir(context); fs.mkdirSync(cacheDir, {recursive: true}); const polyfills = path.join(__dirname, '..', 'polyfills.js').replace(/\\/g, '/'); @@ -64,6 +64,11 @@ function ensureEntryFile (context, mainEntry, options = {}) { lines.push(`require(${JSON.stringify(polyfills)});`); + if (noAnimation) { + // Preserve ENACT_PACK_NO_ANIMATION in output for CI verification (Bun inlines defines elsewhere). + lines.push('module.exports.__enactPackNoAnimation = "ENACT_PACK_NO_ANIMATION";'); + } + if (isomorphic) { lines.push( `var __enactApp = require(${JSON.stringify(main)});`, @@ -142,7 +147,8 @@ function createBuildOptions (opts = {}) { const entryFile = ensureEntryFile(context, mainEntry, { isomorphic: opts.isomorphic, snapshot: useSnapshot, - fastRefresh: !!opts.fastRefresh + fastRefresh: !!opts.fastRefresh, + noAnimation: !!opts.noAnimation }); const development = !opts.production; const publicPath = getPublicPath(development); @@ -210,7 +216,8 @@ function createBuildOptions (opts = {}) { forceCSSModules: !!app.forceCSSModules, accent: app.accent, ri: app.ri, - title: app.title || app.name || '', + title: app.title || '', + fallbackTitle: app.name || '', template, customSkin }; diff --git a/config/bun/build.mjs b/config/bun/build.mjs index bf3341ab..bc012490 100644 --- a/config/bun/build.mjs +++ b/config/bun/build.mjs @@ -67,10 +67,7 @@ function getOutputNaming (buildOpts) { if (buildOpts.contentHash) { return 'main.[hash].[ext]'; } - if (!buildOpts.splitCss) { - return 'main.[ext]'; - } - return buildOpts.isomorphic ? 'main.[ext]' : '[name].[ext]'; + return 'main.[ext]'; } function getIsomorphicExternalsList () { @@ -213,6 +210,7 @@ function finalizeBuild (result, buildOpts, options) { writeIndexHtml(options.outputPath, { title: options.title, + fallbackTitle: options.fallbackTitle, context: options.context, publicPath: options.publicPath, scriptSrc: `${options.publicPath}${jsName}`.replace(/\/{2,}/g, '/'), diff --git a/config/bun/generate-html.js b/config/bun/generate-html.js index b570ce97..87d7504f 100644 --- a/config/bun/generate-html.js +++ b/config/bun/generate-html.js @@ -63,7 +63,7 @@ function renderHtml ({title, scriptSrc, cssHref, isomorphic, externalScripts, ex function writeIndexHtml (outputDir, options) { fs.mkdirSync(outputDir, {recursive: true}); - const title = options.title || readWebOSTitle(options.context) || ''; + const title = options.title || readWebOSTitle(options.context) || options.fallbackTitle || ''; const html = renderHtml({...options, title}); const target = path.join(outputDir, 'index.html'); fs.writeFileSync(target, html, {encoding: 'utf8'}); From 1aa7ae2a67fae48a3362ae021b8bedceca0c3b21 Mon Sep 17 00:00:00 2001 From: Dan Ichim Date: Wed, 22 Jul 2026 13:34:51 +0300 Subject: [PATCH 17/20] review changes --- config/bun/build-framework.mjs | 1 + config/bun/build-options.js | 17 ++-- config/bun/build.mjs | 89 ++++++++++++------ config/bun/dev-server.mjs | 63 ++++++++----- config/bun/framework.js | 20 +++- config/bun/plugins/externals-enact.js | 24 ++--- config/bun/plugins/less-enact.js | 53 ++++++++--- config/bun/watch-files.js | 127 ++++++++++++++++++++++++++ 8 files changed, 311 insertions(+), 83 deletions(-) create mode 100644 config/bun/watch-files.js diff --git a/config/bun/build-framework.mjs b/config/bun/build-framework.mjs index 84ba91aa..b065543b 100644 --- a/config/bun/build-framework.mjs +++ b/config/bun/build-framework.mjs @@ -53,6 +53,7 @@ async function run () { output: options.outputPath, production: opts.production, plugins, + define: options.defines, polyfill: polyfillPath, includeCoreJs: opts.externalsPolyfill && !polyfillPath, snapshot: opts.snapshot diff --git a/config/bun/build-options.js b/config/bun/build-options.js index 229758fd..7eb5e254 100644 --- a/config/bun/build-options.js +++ b/config/bun/build-options.js @@ -42,6 +42,9 @@ function ensureEntryFile (context, mainEntry, options = {}) { const main = mainEntry.replace(/\\/g, '/'); const entryPath = path.join(cacheDir, isomorphic ? 'entry-isomorphic.js' : 'entry.js'); const lines = []; + // Embed dynamic values only via JSON.stringify so generated JS cannot be injected. + const jsLiteral = value => JSON.stringify(String(value)); + const emitRequire = requestPath => 'require(' + jsLiteral(requestPath) + ');'; if (fastRefresh) { lines.push( @@ -57,12 +60,12 @@ function ensureEntryFile (context, mainEntry, options = {}) { if (snapshot && isomorphic) { const {resolveSnapshotHelper} = require('./plugins/snapshot-enact'); lines.push( - `require(${JSON.stringify(resolveSnapshotHelper('snapshot-redux-helper'))});`, - `require(${JSON.stringify(resolveSnapshotHelper('snapshot-helper'))});` + emitRequire(resolveSnapshotHelper('snapshot-redux-helper')), + emitRequire(resolveSnapshotHelper('snapshot-helper')) ); } - lines.push(`require(${JSON.stringify(polyfills)});`); + lines.push(emitRequire(polyfills)); if (noAnimation) { // Preserve ENACT_PACK_NO_ANIMATION in output for CI verification (Bun inlines defines elsewhere). @@ -71,11 +74,11 @@ function ensureEntryFile (context, mainEntry, options = {}) { if (isomorphic) { lines.push( - `var __enactApp = require(${JSON.stringify(main)});`, - `module.exports = __enactApp && __enactApp.__esModule ? __enactApp.default : __enactApp;` + 'var __enactApp = require(' + jsLiteral(main) + ');', + 'module.exports = __enactApp && __enactApp.__esModule ? __enactApp.default : __enactApp;' ); } else { - lines.push(`module.exports = require(${JSON.stringify(main)});`); + lines.push('module.exports = require(' + jsLiteral(main) + ');'); } fs.writeFileSync(entryPath, lines.join('\n'), {encoding: 'utf8'}); @@ -99,6 +102,8 @@ function getResolveAliases (context) { function getDefines (opts = {}) { const defines = { + // Browser global shim (replaces webpack NodePolyfillPlugin ProvidePlugin) + global: 'globalThis', 'process.env.NODE_ENV': JSON.stringify(opts.production ? 'production' : 'development'), 'process.env.PUBLIC_URL': JSON.stringify(opts.publicPath || '/'), ENACT_PACK_ISOMORPHIC: JSON.stringify(!!opts.isomorphic), diff --git a/config/bun/build.mjs b/config/bun/build.mjs index bc012490..e8cb0f7d 100644 --- a/config/bun/build.mjs +++ b/config/bun/build.mjs @@ -317,38 +317,73 @@ async function runBuild (buildOpts) { await buildReactGlobals(options, buildOpts); } + const result = await Bun.build(buildConfig); + const info = finalizeBuild(result, buildOpts, options); + if (!info) process.exit(1); + logBuildResult(buildOpts, options, info); + if (buildOpts.watch) { - console.log('Watching for file changes...'); - - const watchResult = await Bun.build({ - ...buildConfig, - watch: { - onRebuild (error, rebuildResult) { - if (error) { - console.error('Rebuild failed:', error); - return; - } - const rebuildInfo = finalizeBuild(rebuildResult, buildOpts, options); - if (rebuildInfo) { - console.log('Recompiled successfully.'); - logBuildResult(buildOpts, options, rebuildInfo); - } - } - } - }); + await runWatchLoop(buildOpts, options, buildConfig); + } +} - const watchInfo = finalizeBuild(watchResult, buildOpts, options); - if (!watchInfo) process.exit(1); - logBuildResult(buildOpts, options, watchInfo); +async function runWatchLoop (buildOpts, options, buildConfig) { + const {createFileWatcher} = nodeRequire('./watch-files.js'); + let building = false; + let rebuildQueued = false; - await new Promise(() => {}); - return; + async function rebuild () { + if (building) { + rebuildQueued = true; + return; + } + building = true; + try { + const result = await Bun.build(buildConfig); + const rebuildInfo = finalizeBuild(result, buildOpts, options); + if (rebuildInfo) { + console.log('Recompiled successfully.'); + logBuildResult(buildOpts, options, rebuildInfo); + } + } catch (err) { + console.error('Rebuild failed:', err); + } finally { + building = false; + if (rebuildQueued) { + rebuildQueued = false; + await rebuild(); + } + } } - const result = await Bun.build(buildConfig); - const info = finalizeBuild(result, buildOpts, options); - if (!info) process.exit(1); - logBuildResult(buildOpts, options, info); + const watchRoots = [options.context]; + if (Array.isArray(options.additionalModulePaths)) { + watchRoots.push(...options.additionalModulePaths); + } + + console.log('Watching for file changes...'); + const watcher = createFileWatcher(watchRoots, { + ignorePaths: [options.outputPath, getCacheDirPath(options.context)], + onChange: async files => { + const shown = files.slice(0, 3).map(file => path.relative(options.context, file) || file); + const extra = files.length > 3 ? ` (+${files.length - 3} more)` : ''; + console.log(`File change detected (${shown.join(', ')}${extra}), rebuilding...`); + await rebuild(); + } + }); + + await new Promise(resolve => { + const stop = () => { + watcher.close(); + resolve(); + }; + process.once('SIGINT', stop); + process.once('SIGTERM', stop); + }); +} + +function getCacheDirPath (context) { + return path.join(context, 'node_modules', '.cache', 'enact-bun'); } const cliOpts = parseArgs(process.argv.slice(2)); diff --git a/config/bun/dev-server.mjs b/config/bun/dev-server.mjs index 7a768dfc..c2fd4081 100644 --- a/config/bun/dev-server.mjs +++ b/config/bun/dev-server.mjs @@ -100,6 +100,48 @@ const setupProxyHandler = createSetupProxyHandler(buildOpts.context); const tls = getTlsOptions(); const allowedHost = cliOpts.host === '0.0.0.0' ? 'localhost' : cliOpts.host; +let rebuilding = false; +let rebuildQueued = false; + +async function rebuildDevBundle () { + if (rebuilding) { + rebuildQueued = true; + return; + } + rebuilding = true; + try { + await runBuild(buildOpts, entryFile, plugins, cacheDir); + writeDevHtml(cacheDir, {title: buildOpts.title, publicPath: buildOpts.publicPath, customSkin: buildOpts.customSkin}); + console.log('Rebuilt.'); + } catch (err) { + console.error('Rebuild failed:', err); + } finally { + rebuilding = false; + if (rebuildQueued) { + rebuildQueued = false; + await rebuildDevBundle(); + } + } +} + +const {createFileWatcher} = nodeRequire('./watch-files.js'); +const watchRoots = [buildOpts.context]; +if (Array.isArray(buildOpts.additionalModulePaths)) { + watchRoots.push(...buildOpts.additionalModulePaths); +} +const fileWatcher = createFileWatcher(watchRoots, { + ignorePaths: [cacheDir, path.join(buildOpts.context, 'dist')], + onChange: async files => { + const shown = files.slice(0, 3).map(file => path.relative(buildOpts.context, file) || file); + const extra = files.length > 3 ? ` (+${files.length - 3} more)` : ''; + console.log(`File change detected (${shown.join(', ')}${extra}), rebuilding...`); + await rebuildDevBundle(); + } +}); + +process.once('SIGINT', () => fileWatcher.close()); +process.once('SIGTERM', () => fileWatcher.close()); + const server = Bun.serve({ hostname: cliOpts.host, port: cliOpts.port, @@ -163,27 +205,6 @@ const server = Bun.serve({ } }); -Bun.build({ - entrypoints: [entryFile], - outdir: cacheDir, - target: 'browser', - minify: false, - sourcemap: buildOpts.sourcemap ? 'linked' : 'none', - define: buildOpts.defines, - publicPath: buildOpts.publicPath || '/', - plugins, - alias: buildOpts.aliases, - watch: { - onRebuild (error) { - if (error) { - console.error('Rebuild failed:', error); - } else { - console.log('Rebuilt.'); - } - } - } -}); - const protocol = getProtocol(); const localUrl = `${protocol}://localhost:${server.port}${normalizePublicPath(publicPath)}`; console.log(`Starting the development server at ${localUrl}`); diff --git a/config/bun/framework.js b/config/bun/framework.js index 2030f709..8bf0b143 100644 --- a/config/bun/framework.js +++ b/config/bun/framework.js @@ -195,6 +195,17 @@ function writeFrameworkEntry (context, modules, options = {}) { const cacheDir = path.join(context, 'node_modules', '.cache', 'enact-bun'); fs.mkdirSync(cacheDir, {recursive: true}); const entryPath = path.join(cacheDir, 'framework-entry.js'); + + // Embed dynamic values only via JSON.stringify so generated JS cannot be injected. + const jsLiteral = value => JSON.stringify(String(value)); + const registerRequire = (id, requestPath) => + '__register(' + + jsLiteral(id) + + ', function () { return require(' + + jsLiteral(requestPath) + + '); });'; + const emitRequire = requestPath => 'require(' + jsLiteral(requestPath) + ');'; + const lines = [ 'var __registry = Object.create(null);', 'function __register(id, loader) { __registry[id] = loader; }', @@ -202,8 +213,8 @@ function writeFrameworkEntry (context, modules, options = {}) { ]; if (options.polyfill) { - const polyfillPath = options.polyfill.replace(/\\/g, '/'); - lines.push(`__register('@enact/polyfills', function () { return require(${JSON.stringify(polyfillPath)}); });`); + const polyfillPath = path.resolve(options.polyfill).replace(/\\/g, '/'); + lines.push(registerRequire('@enact/polyfills', polyfillPath)); } for (const {id, request} of modules) { @@ -211,7 +222,7 @@ function writeFrameworkEntry (context, modules, options = {}) { if (shouldExcludePath(normalizedRequest)) { continue; } - lines.push(`__register(${JSON.stringify(id)}, function () { return require(${JSON.stringify(request)}); });`); + lines.push(registerRequire(id, normalizedRequest)); } lines.push('', '// Eagerly load framework modules for CSS extraction'); @@ -220,7 +231,7 @@ function writeFrameworkEntry (context, modules, options = {}) { if (shouldExcludePath(normalizedRequest)) { continue; } - lines.push(`require(${JSON.stringify(request)});`); + lines.push(emitRequire(normalizedRequest)); } lines.push( @@ -293,6 +304,7 @@ async function applyFramework (options = {}) { naming: 'enact.[ext]', minify: !!options.production, sourcemap: options.production ? 'none' : 'linked', + define: options.define || {global: 'globalThis'}, plugins }); diff --git a/config/bun/plugins/externals-enact.js b/config/bun/plugins/externals-enact.js index c19ac882..d7ff14b6 100644 --- a/config/bun/plugins/externals-enact.js +++ b/config/bun/plugins/externals-enact.js @@ -116,18 +116,18 @@ function createExternalsEnactPlugin (options = {}) { build.onLoad({filter: /.*/, namespace: 'enact-external'}, args => { const id = args.path; const contents = [ - `const fw = typeof enact_framework !== 'undefined' ? enact_framework : globalThis.enact_framework;`, - `const req = typeof fw === 'function' ? fw : fw && fw.require;`, - `if (!req) {`, - ` throw new Error('External Enact framework not loaded. Include enact.js before the app bundle.');`, - `}`, - `const mod = req(${JSON.stringify(id)});`, - `module.exports = mod && mod.__esModule ? mod.default : mod;`, - `if (mod && typeof mod === 'object') {`, - ` for (const key of Object.keys(mod)) {`, - ` if (key !== 'default') module.exports[key] = mod[key];`, - ` }`, - `}` + "const fw = typeof enact_framework !== 'undefined' ? enact_framework : globalThis.enact_framework;", + 'const req = typeof fw === \'function\' ? fw : fw && fw.require;', + 'if (!req) {', + "\tthrow new Error('External Enact framework not loaded. Include enact.js before the app bundle.');", + '}', + 'const mod = req(' + JSON.stringify(String(id)) + ');', + 'module.exports = mod && mod.__esModule ? mod.default : mod;', + 'if (mod && typeof mod === \'object\') {', + '\tfor (const key of Object.keys(mod)) {', + "\t\tif (key !== 'default') module.exports[key] = mod[key];", + '\t}', + '}' ].join('\n'); return {loader: 'js', contents}; }); diff --git a/config/bun/plugins/less-enact.js b/config/bun/plugins/less-enact.js index 03d4815a..fbacec17 100644 --- a/config/bun/plugins/less-enact.js +++ b/config/bun/plugins/less-enact.js @@ -5,6 +5,13 @@ const sass = require('sass'); const {createPostcssEnactPlugin} = require('./postcss-enact'); const {resolveTildeImport} = require('./resolve-tilde-import'); +const CSS_ASSET_NAMESPACE = 'enact-css-asset'; +const CSS_ASSET_QUERY = '?enact-css'; + +function normalizePath (filePath) { + return path.resolve(filePath).replace(/\\/g, '/'); +} + function isModuleStylesheet (filePath, forceCSSModules) { return forceCSSModules || /\.module\.(css|less|scss|sass)$/.test(filePath); } @@ -67,35 +74,55 @@ async function compileSass (source, filePath) { return result.css; } -function createCssLoadResult (filePath, processed, moduleMode) { - const result = { - loader: 'css', - contents: processed.css, - resolveDir: path.dirname(filePath) - }; - - if (moduleMode) { - result.exports = processed.exports; +function createCssLoadResult (filePath, processed, moduleMode, cssStore) { + if (!moduleMode) { + return { + loader: 'css', + contents: processed.css, + resolveDir: path.dirname(filePath) + }; } - return result; + // Bun ignores `exports` on the css loader, so CSS modules must return JS that + // side-effect imports the processed CSS via a virtual namespace asset. + const key = normalizePath(filePath); + cssStore.set(key, processed.css); + + return { + loader: 'js', + contents: [ + 'import ' + JSON.stringify(String(key + CSS_ASSET_QUERY)) + ';', + 'export default ' + JSON.stringify(processed.exports || {}) + ';' + ].join('\n') + }; } function createLessEnactPlugin (options = {}) { const postcssPlugin = createPostcssEnactPlugin(options); const appContext = options.context || process.cwd(); const lessTildePlugin = createLessTildePlugin(appContext); + const cssStore = new Map(); return { name: 'enact-less', setup (build) { + build.onResolve({filter: /\?enact-css$/}, args => ({ + path: normalizePath(args.path.replace(/\?enact-css$/, '')), + namespace: CSS_ASSET_NAMESPACE + })); + + build.onLoad({filter: /.*/, namespace: CSS_ASSET_NAMESPACE}, args => ({ + loader: 'css', + contents: cssStore.get(normalizePath(args.path)) || '' + })); + build.onLoad({filter: /\.(scss|sass)$/}, async args => { const source = await Bun.file(args.path).text(); const css = await compileSass(source, args.path); const moduleMode = isModuleStylesheet(args.path, options.forceCSSModules); const processed = await postcssPlugin.processCss(css, args.path, moduleMode); - return createCssLoadResult(args.path, processed, moduleMode); + return createCssLoadResult(args.path, processed, moduleMode, cssStore); }); build.onLoad({filter: /\.less$/}, async args => { @@ -112,7 +139,7 @@ function createLessEnactPlugin (options = {}) { const moduleMode = isModuleStylesheet(args.path, options.forceCSSModules); const processed = await postcssPlugin.processCss(lessResult.css, args.path, moduleMode); - return createCssLoadResult(args.path, processed, moduleMode); + return createCssLoadResult(args.path, processed, moduleMode, cssStore); }); build.onLoad({filter: /\.css$/}, async args => { @@ -120,7 +147,7 @@ function createLessEnactPlugin (options = {}) { const cssSource = await Bun.file(args.path).text(); const cssProcessed = await postcssPlugin.processCss(cssSource, args.path, moduleMode); - return createCssLoadResult(args.path, cssProcessed, moduleMode); + return createCssLoadResult(args.path, cssProcessed, moduleMode, cssStore); }); } }; diff --git a/config/bun/watch-files.js b/config/bun/watch-files.js new file mode 100644 index 00000000..ece9b3ca --- /dev/null +++ b/config/bun/watch-files.js @@ -0,0 +1,127 @@ +const fs = require('fs'); +const path = require('path'); + +const IGNORE_DIR_NAMES = new Set([ + 'node_modules', + 'dist', + '.git', + '.cache', + 'coverage', + 'build', + 'tmp', + 'temp' +]); + +const WATCH_EXTENSIONS = /\.(js|jsx|mjs|cjs|ts|tsx|json|css|less|scss|sass|html|ejs|md|txt)$/i; + +function normalizePath (filePath) { + return path.resolve(filePath).replace(/\\/g, '/'); +} + +function shouldIgnoreRelative (relativePath) { + const parts = relativePath.replace(/\\/g, '/').split('/').filter(Boolean); + return parts.some(part => IGNORE_DIR_NAMES.has(part)); +} + +function isWatchableFile (relativePath) { + const base = path.basename(relativePath); + if (base.startsWith('.env')) { + return true; + } + return WATCH_EXTENSIONS.test(relativePath); +} + +/** + * Watch project roots and invoke onChange (debounced) when source files change. + * Bun.build has no watch/onRebuild API, so pack/serve use this instead. + */ +function createFileWatcher (roots, options = {}) { + const debounceMs = options.debounceMs ?? 200; + const onChange = options.onChange; + const ignoreAbsolute = (options.ignorePaths || []).map(normalizePath); + const filter = options.filter; + + let timer = null; + let closed = false; + let pending = new Set(); + const watchers = []; + + const isIgnoredAbsolute = absPath => { + const normalized = normalizePath(absPath); + return ignoreAbsolute.some( + ignored => normalized === ignored || normalized.startsWith(`${ignored}/`) + ); + }; + + const flush = () => { + timer = null; + if (closed || !onChange || pending.size === 0) { + pending.clear(); + return; + } + const files = [...pending]; + pending.clear(); + Promise.resolve(onChange(files)).catch(err => { + console.error('Watch rebuild failed:', err); + }); + }; + + const queue = (root, filename) => { + if (!filename || closed) return; + + const relative = String(filename).replace(/\\/g, '/'); + if (shouldIgnoreRelative(relative) || !isWatchableFile(relative)) { + return; + } + + const absolute = normalizePath(path.join(root, filename)); + if (isIgnoredAbsolute(absolute)) { + return; + } + if (filter && !filter(absolute, relative)) { + return; + } + + pending.add(absolute); + if (timer) { + clearTimeout(timer); + } + timer = setTimeout(flush, debounceMs); + }; + + for (const root of roots) { + const resolvedRoot = path.resolve(root); + if (!fs.existsSync(resolvedRoot)) { + continue; + } + + try { + const watcher = fs.watch(resolvedRoot, {recursive: true}, (_eventType, filename) => { + queue(resolvedRoot, filename); + }); + watcher.on('error', err => { + console.warn(`File watcher error (${resolvedRoot}):`, err.message); + }); + watchers.push(watcher); + } catch (err) { + console.warn(`Unable to watch ${resolvedRoot}:`, err.message); + } + } + + return { + close () { + closed = true; + if (timer) { + clearTimeout(timer); + timer = null; + } + pending.clear(); + for (const watcher of watchers) { + watcher.close(); + } + watchers.length = 0; + } + }; +} + +module.exports = {createFileWatcher, shouldIgnoreRelative, isWatchableFile}; From a959e2204002dbe3065a1d916c177edec562e484 Mon Sep 17 00:00:00 2001 From: Dan Ichim Date: Thu, 23 Jul 2026 18:09:45 +0300 Subject: [PATCH 18/20] review changes --- config/bun/build-options.js | 23 ++++-- config/bun/build.mjs | 11 ++- config/bun/dev-server.mjs | 7 +- config/bun/generate-html.js | 8 ++- config/bun/plugins/eslint-enact.js | 66 ++++++++--------- config/bun/plugins/less-enact.js | 70 +++++++++++------- config/bun/plugins/postcss-enact.js | 13 +++- config/bun/plugins/resolve-enact.js | 62 +++++++++++----- config/bun/plugins/resolve-tilde-import.js | 45 +++++++++++- config/bun/watch-files.js | 83 +++++++++++++++++++++- 10 files changed, 283 insertions(+), 105 deletions(-) diff --git a/config/bun/build-options.js b/config/bun/build-options.js index 7eb5e254..09e6bd1e 100644 --- a/config/bun/build-options.js +++ b/config/bun/build-options.js @@ -86,9 +86,18 @@ function ensureEntryFile (context, mainEntry, options = {}) { } function getResolveAliases (context) { - const aliases = { - 'react-is': path.dirname(require.resolve('react-is/package.json')) - }; + // Pin React singletons to the app copy. Monorepo samples often have a second + // physical react under the repo root; resolving from the importer (e.g. + // ThemeDecorator in ../../) yields two Reacts → "Invalid hook call". + // Mirrors webpack's dedupe set: ['react', 'react-dom', 'react-is', 'scheduler']. + const aliases = {}; + for (const name of ['react', 'react-dom', 'react-is', 'scheduler']) { + try { + aliases[name] = path.dirname(require.resolve(name + '/package.json', {paths: [context]})); + } catch (_e) { + // Package may be absent (e.g. scheduler before install); skip. + } + } if (fs.existsSync(path.join(context, 'node_modules', '@enact', 'i18n', 'ilib'))) { aliases.ilib = '@enact/i18n/ilib'; } else { @@ -176,16 +185,20 @@ function createBuildOptions (opts = {}) { if (frameworkPublicPath) { const ilibInEnact = path.join(frameworkPublicPath, 'node_modules', '@enact', 'i18n', 'ilib'); const ilibStandalone = path.join(frameworkPublicPath, 'node_modules', 'ilib'); - process.env.ILIB_BASE_PATH = fs.existsSync(path.join(context, 'node_modules', '@enact', 'i18n', 'ilib')) + const ilibBase = fs.existsSync(path.join(context, 'node_modules', '@enact', 'i18n', 'ilib')) ? ilibInEnact.replace(/\\/g, '/') : ilibStandalone.replace(/\\/g, '/'); + process.env.ILIB_BASE_PATH = ilibBase; + // Keep Bun defines in sync — getDefines() ran before externals rewrote the path. + defines.ILIB_BASE_PATH = JSON.stringify(ilibBase); } } if (opts.isomorphic || useSnapshot) { // Prerender uses FileXHR, which maps bundled ilib URLs back to the filesystem. process.env.ILIB_CONTEXT = context; - if (defines.ILIB_BASE_PATH) { + // Do not clobber an externals-derived ILIB_BASE_PATH with the local-app define. + if (!process.env.ILIB_BASE_PATH && defines.ILIB_BASE_PATH) { process.env.ILIB_BASE_PATH = JSON.parse(defines.ILIB_BASE_PATH); } const {resolveIlibFsPath} = require('./ilib-meta'); diff --git a/config/bun/build.mjs b/config/bun/build.mjs index e8cb0f7d..86e7fd5f 100644 --- a/config/bun/build.mjs +++ b/config/bun/build.mjs @@ -319,8 +319,8 @@ async function runBuild (buildOpts) { const result = await Bun.build(buildConfig); const info = finalizeBuild(result, buildOpts, options); - if (!info) process.exit(1); - logBuildResult(buildOpts, options, info); + if (!info && !buildOpts.watch) process.exit(1); + if (info) logBuildResult(buildOpts, options, info); if (buildOpts.watch) { await runWatchLoop(buildOpts, options, buildConfig); @@ -328,7 +328,7 @@ async function runBuild (buildOpts) { } async function runWatchLoop (buildOpts, options, buildConfig) { - const {createFileWatcher} = nodeRequire('./watch-files.js'); + const {createFileWatcher, collectWatchRoots} = nodeRequire('./watch-files.js'); let building = false; let rebuildQueued = false; @@ -356,10 +356,7 @@ async function runWatchLoop (buildOpts, options, buildConfig) { } } - const watchRoots = [options.context]; - if (Array.isArray(options.additionalModulePaths)) { - watchRoots.push(...options.additionalModulePaths); - } + const watchRoots = collectWatchRoots(options.context, options.additionalModulePaths); console.log('Watching for file changes...'); const watcher = createFileWatcher(watchRoots, { diff --git a/config/bun/dev-server.mjs b/config/bun/dev-server.mjs index c2fd4081..9e6c6211 100644 --- a/config/bun/dev-server.mjs +++ b/config/bun/dev-server.mjs @@ -124,11 +124,8 @@ async function rebuildDevBundle () { } } -const {createFileWatcher} = nodeRequire('./watch-files.js'); -const watchRoots = [buildOpts.context]; -if (Array.isArray(buildOpts.additionalModulePaths)) { - watchRoots.push(...buildOpts.additionalModulePaths); -} +const {createFileWatcher, collectWatchRoots} = nodeRequire('./watch-files.js'); +const watchRoots = collectWatchRoots(buildOpts.context, buildOpts.additionalModulePaths); const fileWatcher = createFileWatcher(watchRoots, { ignorePaths: [cacheDir, path.join(buildOpts.context, 'dist')], onChange: async files => { diff --git a/config/bun/generate-html.js b/config/bun/generate-html.js index 87d7504f..c759e148 100644 --- a/config/bun/generate-html.js +++ b/config/bun/generate-html.js @@ -37,9 +37,11 @@ function renderHtml ({title, scriptSrc, cssHref, isomorphic, externalScripts, ex .map(href => `\n\t\t`) .join(''); const css = cssHref ? `\n\t\t` : ''; - const externalJs = !isomorphic && (externalScripts || []) - .map(src => `\n\t\t`) - .join(''); + const externalJs = !isomorphic + ? (externalScripts || []) + .map(src => `\n\t\t`) + .join('') + : ''; const scriptType = isomorphic ? 'text/javascript' : 'module'; const appScript = scriptSrc && !isomorphic ? `\n\t\t` diff --git a/config/bun/plugins/eslint-enact.js b/config/bun/plugins/eslint-enact.js index c0a5ac0b..03201bb0 100644 --- a/config/bun/plugins/eslint-enact.js +++ b/config/bun/plugins/eslint-enact.js @@ -1,62 +1,54 @@ const path = require('path'); const {ESLint} = require('eslint'); -let eslintInstance; - -function getESLint (context) { - if (!eslintInstance) { - const configFile = path.join(__dirname, '..', '..', 'eslintWebpackPluginConfig.js'); - eslintInstance = new ESLint({ - overrideConfigFile: configFile, - cache: true, - cacheLocation: path.join(context, 'node_modules', '.cache', '.eslintcache'), - cwd: context, - errorOnUnmatchedPattern: false - }); - } - return eslintInstance; -} - -function shouldLint (filePath) { - if (!/\.(js|mjs|jsx|ts|tsx)$/.test(filePath)) { - return false; - } - if (/node_modules[/\\]/.test(filePath) && !/node_modules[/\\]@enact[/\\]/.test(filePath)) { - return false; - } - return true; -} +const LINT_GLOBS = [ + '**/*.{js,mjs,jsx,ts,tsx}', + // Framework packages are often linked under node_modules/@enact; include them + // explicitly because ESLint skips node_modules for the broad glob. + 'node_modules/@enact/**/*.{js,mjs,jsx,ts,tsx}' +]; function createEslintEnactPlugin (options = {}) { if (options.linting === false) { return null; } + const context = path.resolve(options.context || process.cwd()); + const configFile = path.join(__dirname, '..', '..', 'eslintWebpackPluginConfig.js'); const formatterPath = require.resolve('react-dev-utils/eslintFormatter'); + const eslint = new ESLint({ + overrideConfigFile: configFile, + cache: true, + cacheLocation: path.join(context, 'node_modules', '.cache', '.eslintcache'), + cwd: context, + errorOnUnmatchedPattern: false + }); + + let formatterPromise; + + const getFormatter = () => { + if (!formatterPromise) { + formatterPromise = eslint.loadFormatter(formatterPath); + } + return formatterPromise; + }; return { name: 'enact-eslint', setup (build) { - build.onLoad({filter: /\.(js|mjs|jsx|ts|tsx)$/}, async args => { - if (!shouldLint(args.path)) { - return undefined; - } - - const eslint = getESLint(options.context); - const results = await eslint.lintFiles(args.path); - const formatter = await eslint.loadFormatter(formatterPath); + // One lint pass per Bun.build (including watch rebuilds), not per module. + build.onStart(async () => { + const results = await eslint.lintFiles(LINT_GLOBS); + const formatter = await getFormatter(); const resultText = await formatter.format(results); if (resultText) { console.log(resultText); } - const hasErrors = results.some(result => result.errorCount > 0); - if (hasErrors) { + if (results.some(result => result.errorCount > 0)) { throw new Error('Lint errors found.'); } - - return undefined; }); } }; diff --git a/config/bun/plugins/less-enact.js b/config/bun/plugins/less-enact.js index fbacec17..5338e0ff 100644 --- a/config/bun/plugins/less-enact.js +++ b/config/bun/plugins/less-enact.js @@ -1,13 +1,11 @@ const path = require('path'); const fs = require('fs'); +const crypto = require('crypto'); const less = require('less'); const sass = require('sass'); const {createPostcssEnactPlugin} = require('./postcss-enact'); const {resolveTildeImport} = require('./resolve-tilde-import'); -const CSS_ASSET_NAMESPACE = 'enact-css-asset'; -const CSS_ASSET_QUERY = '?enact-css'; - function normalizePath (filePath) { return path.resolve(filePath).replace(/\\/g, '/'); } @@ -16,6 +14,16 @@ function isModuleStylesheet (filePath, forceCSSModules) { return forceCSSModules || /\.module\.(css|less|scss|sass)$/.test(filePath); } +function getCssCacheDir (appContext) { + return path.join(appContext, 'node_modules', '.cache', 'enact-bun', 'css'); +} + +function isCachedCssAsset (filePath, cssCacheDir) { + const normalized = normalizePath(filePath); + const cacheRoot = normalizePath(cssCacheDir); + return normalized === cacheRoot || normalized.startsWith(cacheRoot + '/'); +} + function createLessTildePlugin (appContext) { class TildeFileManager extends less.FileManager { supports (filename) { @@ -74,7 +82,17 @@ async function compileSass (source, filePath) { return result.css; } -function createCssLoadResult (filePath, processed, moduleMode, cssStore) { +function writeCachedCssAsset (filePath, css, cssCacheDir) { + fs.mkdirSync(cssCacheDir, {recursive: true}); + // Must NOT end in .module.css — Bun would re-scope already-scoped class names. + const hash = crypto.createHash('sha256').update(filePath).digest('hex').slice(0, 8); + const base = path.basename(filePath).replace(/\W/g, '_'); + const target = path.join(cssCacheDir, `${base}_${hash}.css`); + fs.writeFileSync(target, css, {encoding: 'utf8'}); + return normalizePath(target); +} + +function createCssLoadResult (filePath, processed, moduleMode, cssCacheDir) { if (!moduleMode) { return { loader: 'css', @@ -83,15 +101,15 @@ function createCssLoadResult (filePath, processed, moduleMode, cssStore) { }; } - // Bun ignores `exports` on the css loader, so CSS modules must return JS that - // side-effect imports the processed CSS via a virtual namespace asset. - const key = normalizePath(filePath); - cssStore.set(key, processed.css); + // Bun only emits CSS loaded from the file namespace. Virtual-namespace + // {loader:'css'} results are accepted then discarded — write a real file + // and side-effect-import it from JS that exports the locals map. + const target = writeCachedCssAsset(filePath, processed.css, cssCacheDir); return { loader: 'js', contents: [ - 'import ' + JSON.stringify(String(key + CSS_ASSET_QUERY)) + ';', + 'import ' + JSON.stringify(target) + ';', 'export default ' + JSON.stringify(processed.exports || {}) + ';' ].join('\n') }; @@ -101,31 +119,29 @@ function createLessEnactPlugin (options = {}) { const postcssPlugin = createPostcssEnactPlugin(options); const appContext = options.context || process.cwd(); const lessTildePlugin = createLessTildePlugin(appContext); - const cssStore = new Map(); + const cssCacheDir = getCssCacheDir(appContext); return { name: 'enact-less', setup (build) { - build.onResolve({filter: /\?enact-css$/}, args => ({ - path: normalizePath(args.path.replace(/\?enact-css$/, '')), - namespace: CSS_ASSET_NAMESPACE - })); - - build.onLoad({filter: /.*/, namespace: CSS_ASSET_NAMESPACE}, args => ({ - loader: 'css', - contents: cssStore.get(normalizePath(args.path)) || '' - })); - build.onLoad({filter: /\.(scss|sass)$/}, async args => { + if (isCachedCssAsset(args.path, cssCacheDir)) { + return undefined; + } + const source = await Bun.file(args.path).text(); const css = await compileSass(source, args.path); const moduleMode = isModuleStylesheet(args.path, options.forceCSSModules); const processed = await postcssPlugin.processCss(css, args.path, moduleMode); - return createCssLoadResult(args.path, processed, moduleMode, cssStore); + return createCssLoadResult(args.path, processed, moduleMode, cssCacheDir); }); build.onLoad({filter: /\.less$/}, async args => { + if (isCachedCssAsset(args.path, cssCacheDir)) { + return undefined; + } + const source = await Bun.file(args.path).text(); const lessResult = await less.render(source, { filename: args.path, @@ -139,18 +155,24 @@ function createLessEnactPlugin (options = {}) { const moduleMode = isModuleStylesheet(args.path, options.forceCSSModules); const processed = await postcssPlugin.processCss(lessResult.css, args.path, moduleMode); - return createCssLoadResult(args.path, processed, moduleMode, cssStore); + return createCssLoadResult(args.path, processed, moduleMode, cssCacheDir); }); build.onLoad({filter: /\.css$/}, async args => { + // Cached assets are already postcss-processed; re-running with + // forceCSSModules would recurse infinitely. + if (isCachedCssAsset(args.path, cssCacheDir)) { + return undefined; + } + const moduleMode = /\.module\.css$/.test(args.path) || options.forceCSSModules; const cssSource = await Bun.file(args.path).text(); const cssProcessed = await postcssPlugin.processCss(cssSource, args.path, moduleMode); - return createCssLoadResult(args.path, cssProcessed, moduleMode, cssStore); + return createCssLoadResult(args.path, cssProcessed, moduleMode, cssCacheDir); }); } }; } -module.exports = {createLessEnactPlugin, isModuleStylesheet}; +module.exports = {createLessEnactPlugin, isModuleStylesheet, getCssCacheDir, isCachedCssAsset}; diff --git a/config/bun/plugins/postcss-enact.js b/config/bun/plugins/postcss-enact.js index f1afc5ed..81da5ad0 100644 --- a/config/bun/plugins/postcss-enact.js +++ b/config/bun/plugins/postcss-enact.js @@ -6,9 +6,11 @@ const {cssModuleIdent: getLocalIdent} = require('@enact/dev-utils'); const { resolveTildeImport, toCssRelativeImport, + toBundlerCssUrl, parseImportPath, formatImportParams, - createPostcssUrlPlugin + createPostcssUrlPlugin, + createPostcssImportAbsolutePlugin } = require('./resolve-tilde-import'); function createPostcssImportTildePlugin (appContext = process.cwd()) { @@ -30,8 +32,12 @@ function createPostcssImportTildePlugin (appContext = process.cwd()) { try { const resolvedPath = resolveTildeImport(src.slice(1), currentFileDir, appContext); - const relativePath = toCssRelativeImport(currentFileDir, resolvedPath); - atRule.params = formatImportParams(atRule.params, relativePath); + // @import-json resolves via Node from the stylesheet dir — keep relative. + // Plain @import may be relocated into the css cache — pin absolute. + const rewritten = atRule.name === 'import-json' + ? toCssRelativeImport(currentFileDir, resolvedPath) + : toBundlerCssUrl(resolvedPath); + atRule.params = formatImportParams(atRule.params, rewritten); } catch (error) { if (process.env.NODE_ENV !== 'test') { console.warn(`Could not resolve ${src}: ${error.message}`); @@ -46,6 +52,7 @@ createPostcssImportTildePlugin.postcss = true; function buildPostcssPlugins (options = {}) { return [ createPostcssImportTildePlugin(options.context), + createPostcssImportAbsolutePlugin(options.context), createPostcssUrlPlugin(options.context), options.useTailwind && require('tailwindcss'), require('postcss-flexbugs-fixes'), diff --git a/config/bun/plugins/resolve-enact.js b/config/bun/plugins/resolve-enact.js index 8217fe9b..7f8eafe6 100644 --- a/config/bun/plugins/resolve-enact.js +++ b/config/bun/plugins/resolve-enact.js @@ -95,18 +95,20 @@ function resolveFromModulePaths (request, modulePaths) { function getModuleSearchPaths (args, context, additionalModulePaths) { const paths = new Set(); - if (args.resolveDir) { - paths.add(args.resolveDir); - } - if (args.importer) { - paths.add(path.dirname(args.importer)); - } + // Prefer the app context first (webpack resolve.modules: [./node_modules, ...]) + // so monorepo packages do not pull a second copy of shared deps like react. if (context) { paths.add(context); } for (const modulePath of additionalModulePaths) { paths.add(modulePath); } + if (args.resolveDir) { + paths.add(args.resolveDir); + } + if (args.importer) { + paths.add(path.dirname(args.importer)); + } return [...paths]; } @@ -165,20 +167,44 @@ function createResolveEnactPlugin (options = {}) { } } - for (const [key, target] of Object.entries(aliases)) { - if (args.path === key) { - let resolved = target; - if (!path.isAbsolute(target) && !target.startsWith('@')) { - resolved = path.resolve(context, target); - } else { - try { - resolved = require.resolve(target, {paths: [context, args.importer].filter(Boolean)}); - } catch (_e) { - return undefined; - } + // Longest key first so `react-dom` wins over `react` for `react-dom/client`. + const aliasKeys = Object.keys(aliases).sort((a, b) => b.length - a.length); + for (const key of aliasKeys) { + const exact = args.path === key; + const prefixed = args.path.startsWith(key + '/'); + if (!exact && !prefixed) { + continue; + } + + const target = aliases[key]; + const suffix = exact ? '' : args.path.slice(key.length); + let resolved = target; + if (path.isAbsolute(target)) { + const candidate = suffix ? path.join(target, suffix.slice(1)) : target; + const absoluteImport = resolveImportPath(candidate); + if (absoluteImport) { + return toResolveResult(absoluteImport); + } + try { + return toResolveResult(require.resolve(candidate, {paths: [context]})); + } catch (_e) { + return toResolveResult(normalizeBundlerPath(candidate)); + } + } + if (!target.startsWith('@')) { + resolved = path.resolve(context, target); + if (suffix) { + resolved = path.join(resolved, suffix.slice(1)); + } + } else { + try { + const request = exact ? target : target + suffix; + resolved = require.resolve(request, {paths: [context, args.importer].filter(Boolean)}); + } catch (_e) { + return undefined; } - return toResolveResult(resolved); } + return toResolveResult(resolved); } if (args.path === 'ilib' || args.path === '@enact/i18n/ilib') { diff --git a/config/bun/plugins/resolve-tilde-import.js b/config/bun/plugins/resolve-tilde-import.js index 612b51d5..81c10c1f 100644 --- a/config/bun/plugins/resolve-tilde-import.js +++ b/config/bun/plugins/resolve-tilde-import.js @@ -182,9 +182,51 @@ function createPostcssUrlPlugin (appContext = process.cwd()) { } createPostcssUrlPlugin.postcss = true; +/** + * Pin relative @import paths to absolute filesystem paths so CSS relocated into + * the enact-bun css cache still resolves (e.g. @enovaui token sheets left as + * CSS @imports after LESS). url() is already absolute via createPostcssUrlPlugin. + */ +function createPostcssImportAbsolutePlugin (appContext = process.cwd()) { + return { + postcssPlugin: 'postcss-enact-import-absolute', + Once (root) { + const inputFile = root.source?.input?.file || appContext; + const currentFileDir = path.dirname(inputFile); + + root.walkAtRules(atRule => { + if (atRule.name !== 'import') { + return; + } + + const src = parseImportPath(atRule.params); + if (!src || isExternalUrl(src) || src.startsWith('~')) { + return; + } + + let resolvedPath = null; + if (path.isAbsolute(src) || (src.startsWith('/') && fs.existsSync(src))) { + resolvedPath = src; + } else { + const candidate = path.resolve(currentFileDir, src); + if (fs.existsSync(candidate)) { + resolvedPath = candidate; + } + } + + if (resolvedPath) { + atRule.params = formatImportParams(atRule.params, toBundlerCssUrl(resolvedPath)); + } + }); + } + }; +} +createPostcssImportAbsolutePlugin.postcss = true; + module.exports = { resolveTildeImport, toCssRelativeImport, + toBundlerCssUrl, parseImportPath, formatImportParams, isExternalUrl, @@ -193,5 +235,6 @@ module.exports = { resolveCssAssetPath, resolveCssUrlPath, rewriteCssUrls, - createPostcssUrlPlugin + createPostcssUrlPlugin, + createPostcssImportAbsolutePlugin }; diff --git a/config/bun/watch-files.js b/config/bun/watch-files.js index ece9b3ca..0cd4f669 100644 --- a/config/bun/watch-files.js +++ b/config/bun/watch-files.js @@ -1,13 +1,13 @@ const fs = require('fs'); const path = require('path'); +// Do not include "build" — some apps use that as a legitimate source folder name. const IGNORE_DIR_NAMES = new Set([ 'node_modules', 'dist', '.git', '.cache', 'coverage', - 'build', 'tmp', 'temp' ]); @@ -31,6 +31,79 @@ function isWatchableFile (relativePath) { return WATCH_EXTENSIONS.test(relativePath); } +/** + * Resolve @enact/* packages that are symlinks/junctions (or otherwise realpath + * outside node_modules) so framework edits trigger pack/serve rebuilds. + * webpack watched the resolved module graph; Bun only watches explicit roots. + */ +function getLinkedEnactWatchRoots (context) { + const roots = []; + const seen = new Set(); + const enactScope = path.join(path.resolve(context), 'node_modules', '@enact'); + + if (!fs.existsSync(enactScope)) { + return roots; + } + + let entries; + try { + entries = fs.readdirSync(enactScope); + } catch (_e) { + return roots; + } + + for (const name of entries) { + const pkgPath = path.join(enactScope, name); + let realPath; + try { + const stat = fs.lstatSync(pkgPath); + if (!stat.isDirectory() && !stat.isSymbolicLink()) { + continue; + } + realPath = fs.realpathSync(pkgPath); + } catch (_e) { + continue; + } + + const normalizedPkg = normalizePath(pkgPath); + const normalizedReal = normalizePath(realPath); + if (normalizedReal === normalizedPkg || seen.has(normalizedReal)) { + continue; + } + + seen.add(normalizedReal); + roots.push(realPath); + } + + return roots; +} + +function collectWatchRoots (context, additionalModulePaths = []) { + const roots = [path.resolve(context)]; + const seen = new Set([normalizePath(context)]); + + const add = dir => { + if (!dir) return; + const resolved = path.resolve(dir); + const key = normalizePath(resolved); + if (seen.has(key) || !fs.existsSync(resolved)) return; + seen.add(key); + roots.push(resolved); + }; + + if (Array.isArray(additionalModulePaths)) { + for (const modulePath of additionalModulePaths) { + add(modulePath); + } + } + + for (const linked of getLinkedEnactWatchRoots(context)) { + add(linked); + } + + return roots; +} + /** * Watch project roots and invoke onChange (debounced) when source files change. * Bun.build has no watch/onRebuild API, so pack/serve use this instead. @@ -124,4 +197,10 @@ function createFileWatcher (roots, options = {}) { }; } -module.exports = {createFileWatcher, shouldIgnoreRelative, isWatchableFile}; +module.exports = { + createFileWatcher, + shouldIgnoreRelative, + isWatchableFile, + getLinkedEnactWatchRoots, + collectWatchRoots +}; From 00bb0be00727273452441da5cce10d8f08653d79 Mon Sep 17 00:00:00 2001 From: Dan Ichim Date: Fri, 24 Jul 2026 10:53:09 +0300 Subject: [PATCH 19/20] fix css --- config/bun/dev-server.mjs | 24 +++++++++++++++++++++--- config/bun/generate-html.js | 9 ++++++++- config/bun/ilib-meta.js | 5 ++++- 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/config/bun/dev-server.mjs b/config/bun/dev-server.mjs index 9e6c6211..0652ecbb 100644 --- a/config/bun/dev-server.mjs +++ b/config/bun/dev-server.mjs @@ -91,9 +91,17 @@ const plugins = createEnactPlugins({ await runBuild(buildOpts, entryFile, plugins, cacheDir); writeDevHtml(cacheDir, {title: buildOpts.title, publicPath: buildOpts.publicPath, customSkin: buildOpts.customSkin}); +// Copy iLib locale/resources (and webOS meta) into the serve output — same as pack. +// Without this, XHR to /node_modules/ilib/locale/* 404s in the browser. +nodeRequire('./post-build.js').applyPostBuild(buildOpts.context, cacheDir, { + ilibAdditionalResourcesPath: buildOpts.ilibAdditionalResourcesPath, + customSkin: buildOpts.customSkin, + watch: true +}); const publicDir = path.join(buildOpts.context, 'public'); const mocksDir = path.join(buildOpts.context, '__mocks__'); +const appContext = buildOpts.context; const publicPath = buildOpts.publicPath || '/'; const proxyHandler = createProxyHandler(app.proxy, publicDir, publicPath); const setupProxyHandler = createSetupProxyHandler(buildOpts.context); @@ -112,6 +120,11 @@ async function rebuildDevBundle () { try { await runBuild(buildOpts, entryFile, plugins, cacheDir); writeDevHtml(cacheDir, {title: buildOpts.title, publicPath: buildOpts.publicPath, customSkin: buildOpts.customSkin}); + nodeRequire('./post-build.js').applyPostBuild(buildOpts.context, cacheDir, { + ilibAdditionalResourcesPath: buildOpts.ilibAdditionalResourcesPath, + customSkin: buildOpts.customSkin, + watch: true + }); console.log('Rebuilt.'); } catch (err) { console.error('Rebuild failed:', err); @@ -165,10 +178,15 @@ const server = Bun.serve({ }); } - for (const dir of [cacheDir, publicDir, mocksDir]) { + // cacheDir first (bundle + copied iLib), then public/mocks, then app root + // so /node_modules/ilib/* and theme resources resolve like webpack-dev-server. + for (const dir of [cacheDir, publicDir, mocksDir, appContext]) { if (!fs.existsSync(dir)) continue; - const candidate = path.join(dir, pathname.replace(/^\//, '')); - if (candidate.startsWith(dir) && fs.existsSync(candidate) && fs.statSync(candidate).isFile()) { + const root = path.resolve(dir); + const candidate = path.resolve(root, pathname.replace(/^\//, '')); + if ((candidate === root || candidate.startsWith(root + path.sep)) && + fs.existsSync(candidate) && + fs.statSync(candidate).isFile()) { return new Response(Bun.file(candidate), { headers: {'Access-Control-Allow-Origin': '*'} }); diff --git a/config/bun/generate-html.js b/config/bun/generate-html.js index c759e148..5b2814a0 100644 --- a/config/bun/generate-html.js +++ b/config/bun/generate-html.js @@ -75,7 +75,14 @@ function writeIndexHtml (outputDir, options) { function writeDevHtml (cacheDir, options) { fs.mkdirSync(cacheDir, {recursive: true}); const overlay = require('./dev-serve-utils').getDevOverlayScript(); - const html = renderHtml({...options, scriptSrc: './entry.js'}).replace('', `${overlay}\n\t`); + // Bun emits entry.css beside entry.js; pack links it via writeIndexHtml, serve must too. + const cssFile = path.join(cacheDir, 'entry.css'); + const cssHref = fs.existsSync(cssFile) ? './entry.css' : null; + const html = renderHtml({ + ...options, + scriptSrc: './entry.js', + cssHref: options.cssHref !== undefined ? options.cssHref : cssHref + }).replace('', `${overlay}\n\t`); const target = path.join(cacheDir, 'index.html'); fs.writeFileSync(target, html, {encoding: 'utf8'}); return target; diff --git a/config/bun/ilib-meta.js b/config/bun/ilib-meta.js index d6966525..6b6c9fc5 100644 --- a/config/bun/ilib-meta.js +++ b/config/bun/ilib-meta.js @@ -35,7 +35,10 @@ function bundleConst (name) { ); } -function resolveBundlePath ({dir, context, publicPath, relative, symlinks = true}) { +function resolveBundlePath ({dir, context, publicPath, relative, symlinks = false}) { + // Default false matches webpack ILibPlugin({symlinks: false}). Following + // realpaths turns linked @enact/limestone into ../../AppData/... which + // transformPath rewrites to /_/_/_/AppData/... and 404s in the browser. if (path.isAbsolute(dir)) { return JSON.stringify(dir.replace(/\\/g, '/')); } From e642a5dbbd8bdb8d3847753b5268a1cc84f5da16 Mon Sep 17 00:00:00 2001 From: Dan Ichim Date: Fri, 24 Jul 2026 11:42:20 +0300 Subject: [PATCH 20/20] fix jenkins --- config/bun/build-framework.mjs | 1 + config/bun/build.mjs | 1 + config/bun/dev-server.mjs | 1 + config/bun/plugins/eslint-enact.js | 29 +++++++++++++++++++++++++++++ 4 files changed, 32 insertions(+) diff --git a/config/bun/build-framework.mjs b/config/bun/build-framework.mjs index b065543b..5d18e521 100644 --- a/config/bun/build-framework.mjs +++ b/config/bun/build-framework.mjs @@ -39,6 +39,7 @@ async function run () { production: opts.production, sourcemap: options.sourcemap, context: options.context, + outputPath: options.outputPath, accent: options.accent, forceCSSModules: options.forceCSSModules, useTailwind: options.useTailwind, diff --git a/config/bun/build.mjs b/config/bun/build.mjs index 86e7fd5f..9eeb3469 100644 --- a/config/bun/build.mjs +++ b/config/bun/build.mjs @@ -293,6 +293,7 @@ async function runBuild (buildOpts) { production: buildOpts.production, sourcemap: options.sourcemap, context: options.context, + outputPath: options.outputPath, additionalModulePaths: options.additionalModulePaths, accent: options.accent, forceCSSModules: options.forceCSSModules, diff --git a/config/bun/dev-server.mjs b/config/bun/dev-server.mjs index 0652ecbb..ba04259b 100644 --- a/config/bun/dev-server.mjs +++ b/config/bun/dev-server.mjs @@ -79,6 +79,7 @@ const plugins = createEnactPlugins({ production: false, sourcemap: buildOpts.sourcemap, context: buildOpts.context, + outputPath: cacheDir, additionalModulePaths: buildOpts.additionalModulePaths, accent: buildOpts.accent, forceCSSModules: buildOpts.forceCSSModules, diff --git a/config/bun/plugins/eslint-enact.js b/config/bun/plugins/eslint-enact.js index 03201bb0..9584ce71 100644 --- a/config/bun/plugins/eslint-enact.js +++ b/config/bun/plugins/eslint-enact.js @@ -8,6 +8,32 @@ const LINT_GLOBS = [ 'node_modules/@enact/**/*.{js,mjs,jsx,ts,tsx}' ]; +// Webpack's eslint plugin only linted the module graph; Bun scans the filesystem. +// Skip pack outputs (dist, dist2 from pack.sh -o=, custom --output, cache, etc.). +const DEFAULT_IGNORES = [ + '**/dist/**', + '**/dist*/**', + '**/build/**', + '**/coverage/**', + '**/node_modules/.cache/**' +]; + +function toPosix (filePath) { + return filePath.replace(/\\/g, '/'); +} + +function getIgnorePatterns (context, options = {}) { + const ignores = [...DEFAULT_IGNORES]; + const outputPath = options.outputPath && path.resolve(options.outputPath); + if (outputPath) { + const relative = toPosix(path.relative(context, outputPath)); + if (relative && relative !== '.' && !relative.startsWith('..')) { + ignores.push(`${relative}/**`); + } + } + return ignores; +} + function createEslintEnactPlugin (options = {}) { if (options.linting === false) { return null; @@ -18,6 +44,9 @@ function createEslintEnactPlugin (options = {}) { const formatterPath = require.resolve('react-dev-utils/eslintFormatter'); const eslint = new ESLint({ overrideConfigFile: configFile, + overrideConfig: { + ignores: getIgnorePatterns(context, options) + }, cache: true, cacheLocation: path.join(context, 'node_modules', '.cache', '.eslintcache'), cwd: context,