diff --git a/.editorconfig b/.editorconfig
index 2740db33..fb1b7ed3 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -13,3 +13,9 @@ insert_final_newline = true
[*.yml]
indent_style = space
indent_size = 2
+
+# Vendored files - preserve upstream formatting
+[lib/external/**]
+indent_style = unset
+trim_trailing_whitespace = unset
+insert_final_newline = unset
diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml
index 12b771a5..3a6fbcce 100644
--- a/.github/workflows/node.js.yml
+++ b/.github/workflows/node.js.yml
@@ -6,27 +6,37 @@ on:
branches-ignore: "dependabot/**"
jobs:
- build:
+ build-and-test:
# Update it to `ubuntu-latest` only when:
# - our infra is on Debian >=13 which has ImageMagick 7
# - `ubuntu-latest` resolves to v26.x which has ImageMagick 7
# When doing that, also update the `convert` command to `magick`.
runs-on: ubuntu-24.04
+ name: ${{ matrix.NAME }} (${{ matrix.NODE_VERSION }})
strategy:
fail-fast: false
matrix:
+ NAME: [ "test" ]
+ NPM_SCRIPT: [ "qunit" ]
+
# Node.js 18 is required by jqueryui.com
# Remember to include the version used in Dockerfile!
NODE_VERSION: [18.x, 20.x, 22.x, 24.x]
+ include:
+ - NAME: "lint"
+ NODE_VERSION: "24.x"
+ NPM_SCRIPT: "lint"
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Update apt-get cache
run: sudo apt-get update
+ if: "!contains(matrix.NPM_SCRIPT, 'lint')"
- name: Install xsltproc & ImageMagick 6
run: sudo apt-get install -y xsltproc imagemagick
+ if: "!contains(matrix.NPM_SCRIPT, 'lint')"
- name: Use Node.js ${{ matrix.NODE_VERSION }}
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
@@ -38,8 +48,9 @@ jobs:
- name: Install dependencies
run: npm ci
- - name: Prepare for tests
- run: ./node_modules/.bin/grunt prepare
+ - name: Build
+ run: npm run build
+ if: "!contains(matrix.NPM_SCRIPT, 'lint')"
- name: Run tests
- run: npm test
+ run: npm run ${{ matrix.NPM_SCRIPT }}
diff --git a/.gitignore b/.gitignore
index 14adf260..d8ee9e71 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
+.eslintcache
app/dist
jquery-ui
log/downloads.log
diff --git a/Gruntfile.js b/Gruntfile.js
index e664603e..e3b28579 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -34,7 +34,13 @@ grunt.initConfig( {
}
},
eslint: {
- all: [ "*.js", "test/*js", "lib/**/*.js", "app/src/*.js" ]
+ all: [
+ "*.js",
+ "test/*js",
+ "lib/**/*.js",
+ "!lib/external/**/*.js",
+ "app/src/*.js"
+ ]
},
copy: {
appExternalFarbtastic: {
diff --git a/app/src/download.js b/app/src/download.js
index df3b2f47..4e3c3d7b 100644
--- a/app/src/download.js
+++ b/app/src/download.js
@@ -1,4 +1,3 @@
-/* eslint-env jquery, browser */
/*global Hash: false, JST: false, Model: false */
/*!
* jQuery UI DownloadBuilder client-side JavaScript file
diff --git a/app/src/hash.js b/app/src/hash.js
index e630554e..bba1cc9a 100644
--- a/app/src/hash.js
+++ b/app/src/hash.js
@@ -1,4 +1,3 @@
-/* eslint-env jquery, browser */
/*global EventEmitter: false */
/*!
* jQuery UI helper JavaScript file for History and hash support
diff --git a/app/src/model.js b/app/src/model.js
index d9363f71..5a7813c1 100644
--- a/app/src/model.js
+++ b/app/src/model.js
@@ -1,4 +1,3 @@
-/* eslint-env jquery, browser */
/*global EventEmitter: false, LZMA: false, QueryString: false */
/*!
* jQuery UI helper JavaScript file for DownloadBuilder and ThemeRoller models
diff --git a/app/src/querystring.js b/app/src/querystring.js
index 6f7f813d..5ef6630f 100644
--- a/app/src/querystring.js
+++ b/app/src/querystring.js
@@ -1,4 +1,3 @@
-/* eslint-env jquery, browser */
/*!
* jQuery UI helper JavaScript file for QueryString support
*
diff --git a/app/src/themeroller.js b/app/src/themeroller.js
index b521d247..60d1399c 100644
--- a/app/src/themeroller.js
+++ b/app/src/themeroller.js
@@ -1,4 +1,3 @@
-/* eslint-env jquery, browser */
/*global Hash: false, JST: false, Model: false, QueryString: false */
/*!
* jQuery UI ThemeRoller client-side JavaScript file
diff --git a/eslint.config.mjs b/eslint.config.mjs
index a4146bbf..584dcd40 100644
--- a/eslint.config.mjs
+++ b/eslint.config.mjs
@@ -13,6 +13,7 @@ export default [
"app/dist/**",
"external/**",
"jquery-ui/**",
+ "lib/external/**",
"template/**",
"test/fixtures/**",
"tmp/**",
diff --git a/lib/builder-amd-css.js b/lib/builder-amd-css.js
new file mode 100644
index 00000000..b5c2babf
--- /dev/null
+++ b/lib/builder-amd-css.js
@@ -0,0 +1,112 @@
+/**
+ * Generates the CSS bundle of an AMD modular project that uses the `css!`
+ * plugin definitions. It's not a substitute for css plugins like require-css;
+ * it uses require-css (vendored in lib/external/require-css) internally.
+ */
+
+"use strict";
+
+var requireCssFiles,
+ fs = require( "node:fs" ),
+ path = require( "node:path" ),
+ requirejs = require( "./requirejs-memfiles" );
+
+var requireCssDir = __dirname + "/external/require-css";
+
+requireCssFiles = {
+ "require-css/css-builder.js": fs.readFileSync( requireCssDir + "/css-builder.js" ),
+ "require-css/css.js": fs.readFileSync( requireCssDir + "/css.js" ),
+ "require-css/normalize.js": fs.readFileSync( requireCssDir + "/normalize.js" )
+};
+
+function buildCss( files, config, callback ) {
+ var include;
+
+ if ( typeof config !== "object" ) {
+ return callback( new Error( "missing or invalid config (object expected)" ) );
+ }
+ if ( !Array.isArray( config.include ) ) {
+ return callback( new Error( "missing or invalid config.include (array expected)" ) );
+ }
+
+ include = config.include;
+ delete config.include;
+
+ // Include require-css files.
+ Object.keys( requireCssFiles ).forEach( function( filepath ) {
+ files[ filepath ] = requireCssFiles[ filepath ];
+ } );
+
+ function normalizePath( _path ) {
+ return path.normalize( _path ).replace( /^\//, "" );
+ }
+
+ config = Object.assign( {}, config );
+ config.appDir = config.appDir || ".";
+ config.baseUrl = config.baseUrl || ".";
+ config.paths = config.paths || {};
+ config.paths[ "require-css" ] = path.relative( config.appDir, "require-css" );
+ config.map = config.map || {};
+ config.map[ "*" ] = config.map[ "*" ] || {};
+ config.map[ "*" ].css = "require-css/css";
+ config.asReference = {
+ saveFile: function( path, data ) {
+ path = normalizePath( path );
+ files[ path ] = data;
+ },
+ loadFile: function( path ) {
+ var data;
+ path = normalizePath( path );
+ data = files[ path ];
+ if ( config.onCssBuildWrite ) {
+ data = config.onCssBuildWrite( path, data );
+ }
+ return data;
+ }
+ };
+ config.optimizeCss = "none";
+ config.separateCSS = true;
+ config = Object.assign( config, {
+ dir: "dist",
+ modules: [ {
+ name: "output",
+ include: include,
+ create: true
+ } ]
+ } );
+
+ requirejs.setFiles( files, function( done ) {
+ requirejs.optimize( config, function() {
+ callback( null, files[ "dist/output.css" ] || "", files );
+ done();
+ }, function( error ) {
+ callback( error );
+ done();
+ } );
+ } );
+}
+
+/**
+ * @param {Object} files Object containing (path, data) key-value pairs.
+ * @param {Object} config require.js build configuration.
+ * @param {Function} callback Function( error, builtCss, files )
+ */
+module.exports = function( files, config, callback ) {
+ var clonedFiles = {};
+
+ try {
+
+ // Clone files + make sure all CSSes are String utf-8.
+ Object.keys( files ).forEach( function( path ) {
+ if ( /\.css$/i.test( path ) ) {
+ clonedFiles[ path ] = files[ path ].toString( "utf-8" );
+ } else {
+ clonedFiles[ path ] = files[ path ];
+ }
+ } );
+
+ buildCss( clonedFiles, config, callback );
+ } catch ( error ) {
+ callback( error );
+ }
+};
diff --git a/lib/builder-amd.js b/lib/builder-amd.js
new file mode 100644
index 00000000..87d067e5
--- /dev/null
+++ b/lib/builder-amd.js
@@ -0,0 +1,67 @@
+/**
+ * Generates the JS bundle of an AMD modular project.
+ * Ideal for applications that build bundles on the fly using Node.js.
+ */
+
+"use strict";
+
+var requirejs = require( "./requirejs-memfiles" ),
+ util = require( "util" );
+
+function buildJs( files, config, callback ) {
+ var exclude, include;
+
+ if ( typeof config !== "object" ) {
+ return callback( new Error( "missing or invalid config (object expected)" ) );
+ }
+ if ( !Array.isArray( config.include ) ) {
+ return callback( new Error( "missing or invalid config.include (array expected)" ) );
+ }
+
+ exclude = config.exclude;
+ include = config.include;
+ delete config.exclude;
+ delete config.include;
+
+ config = util._extend( {}, config );
+ config.appDir = config.appDir || ".";
+ config.baseUrl = config.baseUrl || ".";
+ config = util._extend( config, {
+ dir: "dist",
+ modules: [ {
+ name: "output",
+ include: include,
+ create: true
+ } ]
+ } );
+
+ if ( exclude ) {
+ config.modules[ 0 ].exclude = exclude;
+ }
+
+ requirejs.setFiles( files, function( done ) {
+ requirejs.optimize( config, function() {
+ callback( null, files[ "dist/output.js" ], files );
+ done();
+ }, function( error ) {
+ callback( error );
+ done();
+ } );
+ } );
+}
+
+/**
+ * @param {Object} files Object containing (path, data) key-value pairs.
+ * @param {Object} config require.js build configuration.
+ * @param {Function} callback Function( error, builtJs, files )
+ */
+module.exports = function( files, config, callback ) {
+ var clonedFiles = {};
+
+ // Clone files
+ Object.keys( files ).forEach( function( path ) {
+ clonedFiles[ path ] = files[ path ];
+ } );
+
+ buildJs( clonedFiles, config, callback );
+};
diff --git a/lib/builder-jquery-css.js b/lib/builder-jquery-css.js
new file mode 100644
index 00000000..8b6655fc
--- /dev/null
+++ b/lib/builder-jquery-css.js
@@ -0,0 +1,101 @@
+/**
+ * Generates the CSS bundle of a jQuery project that uses JS comments like
+ * `//>> css.: files` to define its CSS dependencies and that uses AMD
+ * definitions to define its JS dependencies.
+ */
+
+"use strict";
+
+var amdCssBuilder = require( "./builder-amd-css" );
+
+function cssDependencies( data, which ) {
+ var result = [],
+ regexp = new RegExp( "\\/\\/>>\\s*css\\." + which + ":(.*)", "g" );
+
+ data.replace( regexp, function( garbage, input ) {
+ input = input.split( "," ).map( trim );
+ result.push.apply( result, input );
+ } );
+
+ return result.map( function( cssDependency ) {
+ return "\"css!" + cssDependency.replace( /\.css$/i, "" ) + "\"";
+ } );
+}
+
+function jsDependencies( data ) {
+ var match = data.match( /define\(\ ?\[([^\]]*?)\]/ );
+ if ( match === null ) {
+ return [];
+ }
+ return match[ 1 ].replace( /\/\/.+/g, "" ).split( "," ).map( trim );
+}
+
+/**
+ * transform( data, which )
+ *
+ * @data [String] File content.
+ *
+ * @which [String] The name of the css bundle selector.
+ *
+ * Parse the syntax (a) and transform it into the AMD definition (b).
+ *
+ * a: //>> css.: cssFile1, cssFile2, ...
+ * define([ "foo", "bar" ], function() { ... });
+ *
+ * b: define([ "css!cssFile1", "css!cssFile2", "css!...", "foo", "bar" ]);
+ */
+function transform( data, which ) {
+ var dependencies = [];
+
+ dependencies.push.apply( dependencies, cssDependencies( data, which ) );
+ dependencies.push.apply( dependencies, jsDependencies( data ) );
+
+ return "define([" + dependencies.join( ", " ) + "]);";
+}
+
+// Helper: trim.
+function trim( string ) {
+ return string.trim();
+}
+
+/**
+ * transformFiles( files, which )
+ *
+ * @files [Object]
+ *
+ * @which [String] The name of the css bundle selector.
+ *
+ * Transform the content of each file according to `transform()`.
+ * The original files Object is preserved intact.
+ */
+function transformFiles( files, which ) {
+ var transformedFiles = {};
+ Object.keys( files ).forEach( function( path ) {
+ var data;
+ if ( /\.js$/.test( path ) ) {
+ data = files[ path ].toString( "utf-8" );
+ transformedFiles[ path ] = transform( data, which );
+ } else if ( /\.css$/.test( path ) ) {
+ transformedFiles[ path ] = files[ path ].toString( "utf-8" );
+ } else {
+ transformedFiles[ path ] = files[ path ];
+ }
+ } );
+ return transformedFiles;
+}
+
+
+/**
+ * @param {Object} files Object containing (path, data) key-value pairs.
+ * @param {string} which CSS name selector (e.g., "structure", "theme").
+ * @param {Object} config require.js build configuration.
+ * @param {Function} callback Function( error, builtCss, files )
+ */
+module.exports = function( files, which, config, callback ) {
+ try {
+ var transformedFiles = transformFiles( files, which );
+ amdCssBuilder( transformedFiles, config, callback );
+ } catch ( error ) {
+ callback( error );
+ }
+};
diff --git a/lib/external/require-css/LICENSE b/lib/external/require-css/LICENSE
new file mode 100644
index 00000000..e39e77c7
--- /dev/null
+++ b/lib/external/require-css/LICENSE
@@ -0,0 +1,10 @@
+MIT License
+-----------
+
+Copyright (C) 2013 Guy Bedford
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/lib/external/require-css/README.md b/lib/external/require-css/README.md
new file mode 100644
index 00000000..8c3c39e6
--- /dev/null
+++ b/lib/external/require-css/README.md
@@ -0,0 +1,260 @@
+require-css
+===========
+
+**jQuery UI note:** This is version 0.1.8. `css-builder.js` has been locally
+patched to support in-memory file operations via `config.asReference`
+(used by `builder-amd-css`). See:
+- https://github.com/jquery/builder-amd-css/commit/a7f685c
+- https://github.com/jquery/builder-amd-css/commit/07d8c23
+
+The unmodified original is preserved as `css-builder.js.orig` for reference.
+
+---
+
+RequireJS CSS requiring and optimization, with almond support.
+
+Useful for writing modular CSS dependencies alongside scripts. For an example of widget rendering see [ZestJS](http://zestjs.org).
+
+For LESS inclusion, use [require-less](https://github.com/guybedford/require-less), which behaves and builds the css exactly like this module apart from the preprocessing step.
+
+
+
+Overview
+--------
+
+Allows the construction of scripts that can require CSS, using the simple RequireJS syntax:
+
+```javascript
+define(['css!styles/main'], function() {
+ //code that requires the stylesheet: styles/main.css
+});
+```
+
+Fully compatible in IE 6+, Chrome 3+, Firefox 3.5+, Opera 10+, iOS.
+
+* **CSS builds** When run as part of a build with the RequireJS optimizer, `css!` dependencies are automatically inlined into the built layer within the JavaScript, fully compatible with layering. CSS injection is performed as soon as the layer is loaded.
+* **Option to build separate layer CSS files** A `separateCSS` build parameter allows for built layers to output their css files separately, instead of inline with the JavaScript, for manual inclusion.
+* **CSS compression** CSS redundancy compression is supported through the external library, [csso](https://github.com/css/csso).
+
+Installation and Setup
+----------------------
+
+Download the require-css folder manually or use Bower:
+
+```bash
+bower install require-css
+```
+
+To allow the direct `css!` usage, add the following [map configuration](http://requirejs.org/docs/api.html#config-map) in RequireJS:
+
+```javascript
+map: {
+ '*': {
+ 'css': 'require-css/css' // or whatever the path to require-css is
+ }
+}
+```
+
+Use Cases and Benefits
+----------------------
+
+### Motivation
+
+The use case for RequireCSS came out of a need to manage templates and their CSS together.
+The idea being that a CSS require can be a dependency of the code that dynamically renders a template.
+When writing a large dynamic application, with templates being rendered on the client-side, it can be beneficial to inject the CSS as templates are required instead
+of dumping all the CSS together separately. The added benefit of this is then being able to build the CSS naturally with the RequireJS optimizer,
+which also supports [separate build layers](http://requirejs.org/docs/1.0/docs/faq-optimization.html#priority) as needed.
+
+### Script-inlined CSS Benefits
+
+By default, during the build CSS is compressed and inlined as a string within the layer that injects the CSS when run.
+
+If the layer is included as a `` tag, only one browser request is needed instead of many separate CSS requests with `` tags.
+
+Even better than including a layer as a `` tag is to include the layer dynamically with a non-blocking require.
+Then the page can be displayed while the layer is still loading asynchronously in the background.
+In this case, the CSS that goes with a template being dynamically rendered is loaded with that same script asynchronously.
+No longer does it need to sit in a `` tag that blocks the page display unnecessarily.
+
+Modular CSS
+-----------
+
+RequireCSS implies a CSS modularisation where styles can be scoped directly to the render code that they are bundled with.
+
+Just like JS requires, the order of CSS injection can't be guaranteed. The idea here is that whenever there are style overrides, they should
+be based on using a more specific selector with an extra id or class at the base, and not assuming a CSS load order. Reset and global styles are a repeated dependency of all
+modular styles that build on top of them.
+
+Optimizer Configuration
+-----------------------
+
+### Basic Usage
+
+Optimizer configuration:
+
+```javascript
+{
+ modules: [
+ {
+ name: 'mymodule',
+ exclude: ['css/normalize']
+ }
+ ]
+}
+```
+
+If the contents of 'mymodule' are:
+
+```javascript
+ define(['css!style', 'css!page'], function(css) {
+ //...
+ });
+```
+
+Then the optimizer output would be:
+
+-mymodule.js containing:
+ style.css and page.css which will be dynamically injected
+
+The `css/normalize` exclude is needed due to [r.js issue #289](https://github.com/jrburke/r.js/issues/289)
+
+### Separate File Output
+
+To output the CSS to a separate file, use the configuration:
+
+```javascript
+{
+ separateCSS: true,
+ modules: [
+ {
+ name: 'mymodule'
+ }
+ ]
+}
+```
+
+This will then output all the css to the file `mymodule.css`. This configuration can also be placed on the module object itself for layer-specific settings.
+
+Optimization is fully compatible with exclude and include.
+
+### IE8 and 9 Selector Limit
+
+In IE9 and below, there is a maximum limit of 4095 selectors per stylesheet.
+
+In order to avoid this limit, CSS concatenation can be disabled entirely with the `IESelectorLimit` option.
+
+```javascript
+{
+ IESelectorLimit: true,
+ modules: [
+ {
+ name: 'mymodule'
+ }
+ ]
+}
+```
+
+Ideally build layers would avoid this limit entirely by naturally being designed to not reach it. This option is really only as a fix when nothing else
+is possible as it will degrade injection performance.
+
+This option is also not compatible with the `separateCSS` option.
+
+### Excluding the CSS Module in Production
+
+When dynamic CSS requires are not going to be made in production, a minimal version of RequireCSS can be written by setting a pragma for the build:
+
+```javascript
+{
+ pragmasOnSave: {
+ excludeRequireCss: true
+ }
+}
+```
+
+### siteRoot Configuration
+
+When building the CSS, all URIs are renormalized relative to the site root.
+
+It assumed that the siteRoot matches the build directory in this case.
+
+If this is different, then specify the server path of the siteRoot relative to the baseURL in the configuration.
+
+For example, if the site root is `www` and we are building the directory `www/lib`, we would use the configuration:
+
+```javascript
+{
+ appDir: 'lib',
+ dir: 'lib-built',
+ siteRoot: '../',
+ modules: [
+ {
+ name: 'mymodule'
+ }
+ ]
+}
+```
+
+### Almond Configuration
+
+Almond doesn't support the `packages` configuration option. When using Almond, rather configuration RequireCSS with map configuration instead, by including the following configuration in the production app:
+
+```javascript
+ requirejs.config({
+ map: {
+ '*': {
+ css: 'require-css/css'
+ }
+ }
+ });
+```
+
+### Disabling the Build
+
+To disable any CSS build entirely, use the configuration option `buildCSS`:
+
+```javascript
+{
+ buildCSS: false,
+ modules: [
+ {
+ name: 'mymodule'
+ }
+ ]
+}
+```
+
+CSS requires will then be left in the source "as is". This shouldn't be used with `stubModules`.
+
+CSS Compression
+---------------
+
+CSS compression is supported with [csso](https://github.com/css/csso).
+
+To enable the CSS compression, install csso with npm:
+
+```
+ npm install csso -g
+```
+
+The build log will display the compression results.
+
+When running the r.js optimizer through NodeJS, sometimes the global module isn't found. In this case install csso as a local node module so it can be found.
+
+
+Injection methods
+-----------------
+
+When loading a CSS file or external CSS file, a `` tag is used. Cross-browser support comes through a number of careful browser conditions for this.
+
+If CSS resources such as images are important to be loaded first, these can be added to the require through a loader plugin that can act as a preloader such as [image](https://github.com/millermedeiros/requirejs-plugins) or [font](https://github.com/millermedeiros/requirejs-plugins). Then a require can be written of the form:
+
+```javascript
+require(['css!my-css', 'image!preload-background-image.jpg', 'font!google,families:[Tangerine]']);
+```
+
+License
+---
+
+MIT
+
diff --git a/lib/external/require-css/css-builder.js b/lib/external/require-css/css-builder.js
new file mode 100644
index 00000000..34301055
--- /dev/null
+++ b/lib/external/require-css/css-builder.js
@@ -0,0 +1,245 @@
+define(['require', './normalize'], function(req, normalize) {
+ var cssAPI = {};
+
+ var isWindows = !!process.platform.match(/^win/);
+
+ function compress(css) {
+ if (config.optimizeCss == 'none') {
+ return css;
+ }
+
+ if (typeof process !== "undefined" && process.versions && !!process.versions.node && require.nodeRequire) {
+ try {
+ var csso = require.nodeRequire('csso');
+ }
+ catch(e) {
+ console.log('Compression module not installed. Use "npm install csso -g" to enable.');
+ return css;
+ }
+ var csslen = css.length;
+ try {
+ css = csso.justDoIt(css);
+ }
+ catch(e) {
+ console.log('Compression failed due to a CSS syntax error.');
+ return css;
+ }
+ console.log('Compressed CSS output to ' + Math.round(css.length / csslen * 100) + '%.');
+ return css;
+ }
+ console.log('Compression not supported outside of nodejs environments.');
+ return css;
+ }
+
+ //load file code - stolen from text plugin
+ // jQuery UI: added config.asReference.loadFile support for in-memory file operations.
+ // Ref https://github.com/jquery/builder-amd-css/commit/a7f685c
+ // Ref https://github.com/jquery/builder-amd-css/commit/07d8c23
+ function loadFile(path) {
+ if ( config.asReference && config.asReference.loadFile ) {
+ return config.asReference.loadFile( path );
+ } else if (typeof process !== "undefined" && process.versions && !!process.versions.node && require.nodeRequire) {
+ var fs = require.nodeRequire('fs');
+ var file = fs.readFileSync(path, 'utf8');
+ if (file.indexOf('\uFEFF') === 0)
+ return file.substring(1);
+ return file;
+ }
+ else {
+ var file = new java.io.File(path),
+ lineSeparator = java.lang.System.getProperty("line.separator"),
+ input = new java.io.BufferedReader(new java.io.InputStreamReader(new java.io.FileInputStream(file), 'utf-8')),
+ stringBuffer, line;
+ try {
+ stringBuffer = new java.lang.StringBuffer();
+ line = input.readLine();
+ if (line && line.length() && line.charAt(0) === 0xfeff)
+ line = line.substring(1);
+ stringBuffer.append(line);
+ while ((line = input.readLine()) !== null) {
+ stringBuffer.append(lineSeparator).append(line);
+ }
+ return String(stringBuffer.toString());
+ }
+ finally {
+ input.close();
+ }
+ }
+ }
+
+
+ // jQuery UI: added config.asReference.saveFile support for in-memory file operations.
+ // Ref https://github.com/jquery/builder-amd-css/commit/a7f685c
+ // Ref https://github.com/jquery/builder-amd-css/commit/07d8c23
+ function saveFile(path, data) {
+ if ( config.asReference && config.asReference.saveFile ) {
+ config.asReference.saveFile( path, data );
+ } else if (typeof process !== "undefined" && process.versions && !!process.versions.node && require.nodeRequire) {
+ var fs = require.nodeRequire('fs');
+ fs.writeFileSync(path, data, 'utf8');
+ }
+ else {
+ var content = new java.lang.String(data);
+ var output = new java.io.BufferedWriter(new java.io.OutputStreamWriter(new java.io.FileOutputStream(path), 'utf-8'));
+
+ try {
+ output.write(content, 0, content.length());
+ output.flush();
+ }
+ finally {
+ output.close();
+ }
+ }
+ }
+
+ //when adding to the link buffer, paths are normalised to the baseUrl
+ //when removing from the link buffer, paths are normalised to the output file path
+ function escape(content) {
+ return content.replace(/(["'\\])/g, '\\$1')
+ .replace(/[\f]/g, "\\f")
+ .replace(/[\b]/g, "\\b")
+ .replace(/[\n]/g, "\\n")
+ .replace(/[\t]/g, "\\t")
+ .replace(/[\r]/g, "\\r");
+ }
+
+ // NB add @media query support for media imports
+ var importRegEx = /@import\s*(url)?\s*(('([^']*)'|"([^"]*)")|\(('([^']*)'|"([^"]*)"|([^\)]*))\))\s*;?/g;
+ var absUrlRegEx = /^([^\:\/]+:\/)?\//;
+
+ // Write Css module definition
+ var writeCSSDefinition = "define('@writecss', function() {return function writeCss(c) {var d=document,a='appendChild',i='styleSheet',s=d.createElement('style');s.type='text/css';d.getElementsByTagName('head')[0][a](s);s[i]?s[i].cssText=c:s[a](d.createTextNode(c));};});";
+
+ var siteRoot;
+
+ var baseParts = req.toUrl('base_url').split('/');
+ baseParts[baseParts.length - 1] = '';
+ var baseUrl = baseParts.join('/');
+
+ var curModule = 0;
+ var config;
+
+ var writeCSSForLayer = true;
+ var layerBuffer = [];
+ var cssBuffer = {};
+
+ cssAPI.load = function(name, req, load, _config) {
+ //store config
+ config = config || _config;
+
+ if (!siteRoot) {
+ siteRoot = path.resolve(config.dir || path.dirname(config.out), config.siteRoot || '.') + '/';
+ if (isWindows)
+ siteRoot = siteRoot.replace(/\\/g, '/');
+ }
+
+ //external URLS don't get added (just like JS requires)
+ if (name.match(absUrlRegEx))
+ return load();
+
+ var fileUrl = req.toUrl(name + '.css');
+ if (isWindows)
+ fileUrl = fileUrl.replace(/\\/g, '/');
+
+ // rebase to the output directory if based on the source directory;
+ // baseUrl points always to the output directory, fileUrl only if
+ // it is not prefixed by a computed path (relative too)
+ var fileSiteUrl = fileUrl;
+ if (fileSiteUrl.indexOf(baseUrl) < 0) {
+ var appRoot = req.toUrl(config.appDir);
+ if (isWindows)
+ appRoot = appRoot.replace(/\\/g, '/');
+ if (fileSiteUrl.indexOf(appRoot) == 0)
+ fileSiteUrl = siteRoot + fileSiteUrl.substring(appRoot.length);
+ }
+
+ //add to the buffer
+ cssBuffer[name] = normalize(loadFile(fileUrl), fileSiteUrl, siteRoot);
+
+ load();
+ }
+
+ cssAPI.normalize = function(name, normalize) {
+ if (name.substr(name.length - 4, 4) == '.css')
+ name = name.substr(0, name.length - 4);
+ return normalize(name);
+ }
+
+ cssAPI.write = function(pluginName, moduleName, write, parse) {
+ var cssModule;
+
+ //external URLS don't get added (just like JS requires)
+ if (moduleName.match(absUrlRegEx))
+ return;
+
+ layerBuffer.push(cssBuffer[moduleName]);
+
+ if (!global._requirejsCssData) {
+ global._requirejsCssData = {
+ usedBy: {css: true},
+ css: ''
+ }
+ } else {
+ global._requirejsCssData.usedBy.css = true;
+ }
+
+ if (config.buildCSS != false) {
+ var style = cssBuffer[moduleName];
+
+ if (config.writeCSSModule && style) {
+ if (writeCSSForLayer) {
+ writeCSSForLayer = false;
+ write(writeCSSDefinition);
+ }
+
+ cssModule = 'define(["@writecss"], function(writeCss){\n writeCss("'+ escape(compress(style)) +'");\n})';
+ }
+ else {
+ cssModule = 'define(function(){})';
+ }
+
+ write.asModule(pluginName + '!' + moduleName, cssModule);
+ }
+ }
+
+ cssAPI.onLayerEnd = function(write, data) {
+ if (config.separateCSS && config.IESelectorLimit)
+ throw 'RequireCSS: separateCSS option is not compatible with ensuring the IE selector limit';
+
+ if (config.separateCSS) {
+ var outPath = data.path.replace(/(\.js)?$/, '.css');
+
+ var css = layerBuffer.join('');
+
+ // jQuery UI: unwrapped from process.nextTick for synchronous in-memory
+ // file operations; removed console.log.
+ // Ref https://github.com/jquery/builder-amd-css/commit/a7f685c
+ if (global._requirejsCssData) {
+ css = global._requirejsCssData.css = css + global._requirejsCssData.css;
+ delete global._requirejsCssData.usedBy.css;
+ if (Object.keys(global._requirejsCssData.usedBy).length === 0) {
+ delete global._requirejsCssData;
+ }
+ }
+
+ saveFile(outPath, compress(css));
+
+ }
+ else if (config.buildCSS != false && config.writeCSSModule != true) {
+ var styles = config.IESelectorLimit ? layerBuffer : [layerBuffer.join('')];
+ for (var i = 0; i < styles.length; i++) {
+ if (styles[i] == '')
+ return;
+ write(
+ "(function(c){var d=document,a='appendChild',i='styleSheet',s=d.createElement('style');s.type='text/css';d.getElementsByTagName('head')[0][a](s);s[i]?s[i].cssText=c:s[a](d.createTextNode(c));})\n"
+ + "('" + escape(compress(styles[i])) + "');\n"
+ );
+ }
+ }
+ //clear layer buffer for next layer
+ layerBuffer = [];
+ writeCSSForLayer = true;
+ }
+
+ return cssAPI;
+});
diff --git a/lib/external/require-css/css-builder.js.orig b/lib/external/require-css/css-builder.js.orig
new file mode 100644
index 00000000..c7929dfb
--- /dev/null
+++ b/lib/external/require-css/css-builder.js.orig
@@ -0,0 +1,235 @@
+define(['require', './normalize'], function(req, normalize) {
+ var cssAPI = {};
+
+ var isWindows = !!process.platform.match(/^win/);
+
+ function compress(css) {
+ if (config.optimizeCss == 'none') {
+ return css;
+ }
+
+ if (typeof process !== "undefined" && process.versions && !!process.versions.node && require.nodeRequire) {
+ try {
+ var csso = require.nodeRequire('csso');
+ }
+ catch(e) {
+ console.log('Compression module not installed. Use "npm install csso -g" to enable.');
+ return css;
+ }
+ var csslen = css.length;
+ try {
+ css = csso.justDoIt(css);
+ }
+ catch(e) {
+ console.log('Compression failed due to a CSS syntax error.');
+ return css;
+ }
+ console.log('Compressed CSS output to ' + Math.round(css.length / csslen * 100) + '%.');
+ return css;
+ }
+ console.log('Compression not supported outside of nodejs environments.');
+ return css;
+ }
+
+ //load file code - stolen from text plugin
+ function loadFile(path) {
+ if (typeof process !== "undefined" && process.versions && !!process.versions.node && require.nodeRequire) {
+ var fs = require.nodeRequire('fs');
+ var file = fs.readFileSync(path, 'utf8');
+ if (file.indexOf('\uFEFF') === 0)
+ return file.substring(1);
+ return file;
+ }
+ else {
+ var file = new java.io.File(path),
+ lineSeparator = java.lang.System.getProperty("line.separator"),
+ input = new java.io.BufferedReader(new java.io.InputStreamReader(new java.io.FileInputStream(file), 'utf-8')),
+ stringBuffer, line;
+ try {
+ stringBuffer = new java.lang.StringBuffer();
+ line = input.readLine();
+ if (line && line.length() && line.charAt(0) === 0xfeff)
+ line = line.substring(1);
+ stringBuffer.append(line);
+ while ((line = input.readLine()) !== null) {
+ stringBuffer.append(lineSeparator).append(line);
+ }
+ return String(stringBuffer.toString());
+ }
+ finally {
+ input.close();
+ }
+ }
+ }
+
+
+ function saveFile(path, data) {
+ if (typeof process !== "undefined" && process.versions && !!process.versions.node && require.nodeRequire) {
+ var fs = require.nodeRequire('fs');
+ fs.writeFileSync(path, data, 'utf8');
+ }
+ else {
+ var content = new java.lang.String(data);
+ var output = new java.io.BufferedWriter(new java.io.OutputStreamWriter(new java.io.FileOutputStream(path), 'utf-8'));
+
+ try {
+ output.write(content, 0, content.length());
+ output.flush();
+ }
+ finally {
+ output.close();
+ }
+ }
+ }
+
+ //when adding to the link buffer, paths are normalised to the baseUrl
+ //when removing from the link buffer, paths are normalised to the output file path
+ function escape(content) {
+ return content.replace(/(["'\\])/g, '\\$1')
+ .replace(/[\f]/g, "\\f")
+ .replace(/[\b]/g, "\\b")
+ .replace(/[\n]/g, "\\n")
+ .replace(/[\t]/g, "\\t")
+ .replace(/[\r]/g, "\\r");
+ }
+
+ // NB add @media query support for media imports
+ var importRegEx = /@import\s*(url)?\s*(('([^']*)'|"([^"]*)")|\(('([^']*)'|"([^"]*)"|([^\)]*))\))\s*;?/g;
+ var absUrlRegEx = /^([^\:\/]+:\/)?\//;
+
+ // Write Css module definition
+ var writeCSSDefinition = "define('@writecss', function() {return function writeCss(c) {var d=document,a='appendChild',i='styleSheet',s=d.createElement('style');s.type='text/css';d.getElementsByTagName('head')[0][a](s);s[i]?s[i].cssText=c:s[a](d.createTextNode(c));};});";
+
+ var siteRoot;
+
+ var baseParts = req.toUrl('base_url').split('/');
+ baseParts[baseParts.length - 1] = '';
+ var baseUrl = baseParts.join('/');
+
+ var curModule = 0;
+ var config;
+
+ var writeCSSForLayer = true;
+ var layerBuffer = [];
+ var cssBuffer = {};
+
+ cssAPI.load = function(name, req, load, _config) {
+ //store config
+ config = config || _config;
+
+ if (!siteRoot) {
+ siteRoot = path.resolve(config.dir || path.dirname(config.out), config.siteRoot || '.') + '/';
+ if (isWindows)
+ siteRoot = siteRoot.replace(/\\/g, '/');
+ }
+
+ //external URLS don't get added (just like JS requires)
+ if (name.match(absUrlRegEx))
+ return load();
+
+ var fileUrl = req.toUrl(name + '.css');
+ if (isWindows)
+ fileUrl = fileUrl.replace(/\\/g, '/');
+
+ // rebase to the output directory if based on the source directory;
+ // baseUrl points always to the output directory, fileUrl only if
+ // it is not prefixed by a computed path (relative too)
+ var fileSiteUrl = fileUrl;
+ if (fileSiteUrl.indexOf(baseUrl) < 0) {
+ var appRoot = req.toUrl(config.appDir);
+ if (isWindows)
+ appRoot = appRoot.replace(/\\/g, '/');
+ if (fileSiteUrl.indexOf(appRoot) == 0)
+ fileSiteUrl = siteRoot + fileSiteUrl.substring(appRoot.length);
+ }
+
+ //add to the buffer
+ cssBuffer[name] = normalize(loadFile(fileUrl), fileSiteUrl, siteRoot);
+
+ load();
+ }
+
+ cssAPI.normalize = function(name, normalize) {
+ if (name.substr(name.length - 4, 4) == '.css')
+ name = name.substr(0, name.length - 4);
+ return normalize(name);
+ }
+
+ cssAPI.write = function(pluginName, moduleName, write, parse) {
+ var cssModule;
+
+ //external URLS don't get added (just like JS requires)
+ if (moduleName.match(absUrlRegEx))
+ return;
+
+ layerBuffer.push(cssBuffer[moduleName]);
+
+ if (!global._requirejsCssData) {
+ global._requirejsCssData = {
+ usedBy: {css: true},
+ css: ''
+ }
+ } else {
+ global._requirejsCssData.usedBy.css = true;
+ }
+
+ if (config.buildCSS != false) {
+ var style = cssBuffer[moduleName];
+
+ if (config.writeCSSModule && style) {
+ if (writeCSSForLayer) {
+ writeCSSForLayer = false;
+ write(writeCSSDefinition);
+ }
+
+ cssModule = 'define(["@writecss"], function(writeCss){\n writeCss("'+ escape(compress(style)) +'");\n})';
+ }
+ else {
+ cssModule = 'define(function(){})';
+ }
+
+ write.asModule(pluginName + '!' + moduleName, cssModule);
+ }
+ }
+
+ cssAPI.onLayerEnd = function(write, data) {
+ if (config.separateCSS && config.IESelectorLimit)
+ throw 'RequireCSS: separateCSS option is not compatible with ensuring the IE selector limit';
+
+ if (config.separateCSS) {
+ var outPath = data.path.replace(/(\.js)?$/, '.css');
+ console.log('Writing CSS! file: ' + outPath + '\n');
+
+ var css = layerBuffer.join('');
+
+ process.nextTick(function() {
+ if (global._requirejsCssData) {
+ css = global._requirejsCssData.css = css + global._requirejsCssData.css;
+ delete global._requirejsCssData.usedBy.css;
+ if (Object.keys(global._requirejsCssData.usedBy).length === 0) {
+ delete global._requirejsCssData;
+ }
+ }
+
+ saveFile(outPath, compress(css));
+ });
+
+ }
+ else if (config.buildCSS != false && config.writeCSSModule != true) {
+ var styles = config.IESelectorLimit ? layerBuffer : [layerBuffer.join('')];
+ for (var i = 0; i < styles.length; i++) {
+ if (styles[i] == '')
+ return;
+ write(
+ "(function(c){var d=document,a='appendChild',i='styleSheet',s=d.createElement('style');s.type='text/css';d.getElementsByTagName('head')[0][a](s);s[i]?s[i].cssText=c:s[a](d.createTextNode(c));})\n"
+ + "('" + escape(compress(styles[i])) + "');\n"
+ );
+ }
+ }
+ //clear layer buffer for next layer
+ layerBuffer = [];
+ writeCSSForLayer = true;
+ }
+
+ return cssAPI;
+});
diff --git a/lib/external/require-css/css.js b/lib/external/require-css/css.js
new file mode 100644
index 00000000..bed79d9b
--- /dev/null
+++ b/lib/external/require-css/css.js
@@ -0,0 +1,168 @@
+/*
+ * Require-CSS RequireJS css! loader plugin
+ * 0.1.2
+ * Guy Bedford 2013
+ * MIT
+ */
+
+/*
+ *
+ * Usage:
+ * require(['css!./mycssFile']);
+ *
+ * Tested and working in (up to latest versions as of March 2013):
+ * Android
+ * iOS 6
+ * IE 6 - 10
+ * Chome 3 - 26
+ * Firefox 3.5 - 19
+ * Opera 10 - 12
+ *
+ * browserling.com used for virtual testing environment
+ *
+ * Credit to B Cavalier & J Hann for the IE 6 - 9 method,
+ * refined with help from Martin Cermak
+ *
+ * Sources that helped along the way:
+ * - https://developer.mozilla.org/en-US/docs/Browser_detection_using_the_user_agent
+ * - http://www.phpied.com/when-is-a-stylesheet-really-loaded/
+ * - https://github.com/cujojs/curl/blob/master/src/curl/plugin/css.js
+ *
+ */
+
+define(function() {
+//>>excludeStart('excludeRequireCss', pragmas.excludeRequireCss)
+ if (typeof window == 'undefined')
+ return { load: function(n, r, load){ load() } };
+
+ var head = document.getElementsByTagName('head')[0];
+
+ var engine = window.navigator.userAgent.match(/Trident\/([^ ;]*)|AppleWebKit\/([^ ;]*)|Opera\/([^ ;]*)|rv\:([^ ;]*)(.*?)Gecko\/([^ ;]*)|MSIE\s([^ ;]*)|AndroidWebKit\/([^ ;]*)/) || 0;
+
+ // use @import load method (IE < 9, Firefox < 18)
+ var useImportLoad = false;
+
+ // set to false for explicit load checking when onload doesn't work perfectly (webkit)
+ var useOnload = true;
+
+ // trident / msie
+ if (engine[1] || engine[7])
+ useImportLoad = parseInt(engine[1]) < 6 || parseInt(engine[7]) <= 9;
+ // webkit
+ else if (engine[2] || engine[8])
+ useOnload = false;
+ // gecko
+ else if (engine[4])
+ useImportLoad = parseInt(engine[4]) < 18;
+
+//>>excludeEnd('excludeRequireCss')
+ //main api object
+ var cssAPI = {};
+
+//>>excludeStart('excludeRequireCss', pragmas.excludeRequireCss)
+ cssAPI.pluginBuilder = './css-builder';
+
+ // @import load method
+ var curStyle, curSheet;
+ var createStyle = function () {
+ curStyle = document.createElement('style');
+ head.appendChild(curStyle);
+ curSheet = curStyle.styleSheet || curStyle.sheet;
+ }
+ var ieCnt = 0;
+ var ieLoads = [];
+ var ieCurCallback;
+
+ var createIeLoad = function(url) {
+ ieCnt++;
+ if (ieCnt == 32) {
+ createStyle();
+ ieCnt = 0;
+ }
+ curSheet.addImport(url);
+ curStyle.onload = function(){ processIeLoad() };
+ }
+ var processIeLoad = function() {
+ ieCurCallback();
+
+ var nextLoad = ieLoads.shift();
+
+ if (!nextLoad) {
+ ieCurCallback = null;
+ return;
+ }
+
+ ieCurCallback = nextLoad[1];
+ createIeLoad(nextLoad[0]);
+ }
+ var importLoad = function(url, callback) {
+ if (!curSheet || !curSheet.addImport)
+ createStyle();
+
+ if (curSheet && curSheet.addImport) {
+ // old IE
+ if (ieCurCallback) {
+ ieLoads.push([url, callback]);
+ }
+ else {
+ createIeLoad(url);
+ ieCurCallback = callback;
+ }
+ }
+ else {
+ // old Firefox
+ curStyle.textContent = '@import "' + url + '";';
+
+ var loadInterval = setInterval(function() {
+ try {
+ curStyle.sheet.cssRules;
+ clearInterval(loadInterval);
+ callback();
+ } catch(e) {}
+ }, 10);
+ }
+ }
+
+ // load method
+ var linkLoad = function(url, callback) {
+ var link = document.createElement('link');
+ link.type = 'text/css';
+ link.rel = 'stylesheet';
+ if (useOnload)
+ link.onload = function() {
+ link.onload = function() {};
+ // for style dimensions queries, a short delay can still be necessary
+ setTimeout(callback, 7);
+ }
+ else
+ var loadInterval = setInterval(function() {
+ for (var i = 0; i < document.styleSheets.length; i++) {
+ var sheet = document.styleSheets[i];
+ if (sheet.href == link.href) {
+ clearInterval(loadInterval);
+ return callback();
+ }
+ }
+ }, 10);
+ link.href = url;
+ head.appendChild(link);
+ }
+
+//>>excludeEnd('excludeRequireCss')
+ cssAPI.normalize = function(name, normalize) {
+ if (name.substr(name.length - 4, 4) == '.css')
+ name = name.substr(0, name.length - 4);
+
+ return normalize(name);
+ }
+
+//>>excludeStart('excludeRequireCss', pragmas.excludeRequireCss)
+ cssAPI.load = function(cssId, req, load, config) {
+
+ (useImportLoad ? importLoad : linkLoad)(req.toUrl(cssId + '.css'), load);
+
+ }
+
+//>>excludeEnd('excludeRequireCss')
+ return cssAPI;
+});
diff --git a/lib/external/require-css/normalize.js b/lib/external/require-css/normalize.js
new file mode 100644
index 00000000..bca13946
--- /dev/null
+++ b/lib/external/require-css/normalize.js
@@ -0,0 +1,141 @@
+//>>excludeStart('excludeRequireCss', pragmas.excludeRequireCss)
+/*
+ * css.normalize.js
+ *
+ * CSS Normalization
+ *
+ * CSS paths are normalized based on an optional basePath and the RequireJS config
+ *
+ * Usage:
+ * normalize(css, fromBasePath, toBasePath);
+ *
+ * css: the stylesheet content to normalize
+ * fromBasePath: the absolute base path of the css relative to any root (but without ../ backtracking)
+ * toBasePath: the absolute new base path of the css relative to the same root
+ *
+ * Absolute dependencies are left untouched.
+ *
+ * Urls in the CSS are picked up by regular expressions.
+ * These will catch all statements of the form:
+ *
+ * url(*)
+ * url('*')
+ * url("*")
+ *
+ * @import '*'
+ * @import "*"
+ *
+ * (and so also @import url(*) variations)
+ *
+ * For urls needing normalization
+ *
+ */
+
+define(function() {
+
+ // regular expression for removing double slashes
+ // eg http://www.example.com//my///url/here -> http://www.example.com/my/url/here
+ var slashes = /([^:])\/+/g
+ var removeDoubleSlashes = function(uri) {
+ return uri.replace(slashes, '$1/');
+ }
+
+ // given a relative URI, and two absolute base URIs, convert it from one base to another
+ var protocolRegEx = /[^\:\/]*:\/\/([^\/])*/;
+ var absUrlRegEx = /^(\/|data:)/;
+ function convertURIBase(uri, fromBase, toBase) {
+ if (uri.match(absUrlRegEx) || uri.match(protocolRegEx))
+ return uri;
+ uri = removeDoubleSlashes(uri);
+ // if toBase specifies a protocol path, ensure this is the same protocol as fromBase, if not
+ // use absolute path at fromBase
+ var toBaseProtocol = toBase.match(protocolRegEx);
+ var fromBaseProtocol = fromBase.match(protocolRegEx);
+ if (fromBaseProtocol && (!toBaseProtocol || toBaseProtocol[1] != fromBaseProtocol[1] || toBaseProtocol[2] != fromBaseProtocol[2]))
+ return absoluteURI(uri, fromBase);
+
+ else {
+ return relativeURI(absoluteURI(uri, fromBase), toBase);
+ }
+ };
+
+ // given a relative URI, calculate the absolute URI
+ function absoluteURI(uri, base) {
+ if (uri.substr(0, 2) == './')
+ uri = uri.substr(2);
+
+ // absolute urls are left in tact
+ if (uri.match(absUrlRegEx) || uri.match(protocolRegEx))
+ return uri;
+
+ var baseParts = base.split('/');
+ var uriParts = uri.split('/');
+
+ baseParts.pop();
+
+ while (curPart = uriParts.shift())
+ if (curPart == '..')
+ baseParts.pop();
+ else
+ baseParts.push(curPart);
+
+ return baseParts.join('/');
+ };
+
+
+ // given an absolute URI, calculate the relative URI
+ function relativeURI(uri, base) {
+
+ // reduce base and uri strings to just their difference string
+ var baseParts = base.split('/');
+ baseParts.pop();
+ base = baseParts.join('/') + '/';
+ i = 0;
+ while (base.substr(i, 1) == uri.substr(i, 1))
+ i++;
+ while (base.substr(i, 1) != '/')
+ i--;
+ base = base.substr(i + 1);
+ uri = uri.substr(i + 1);
+
+ // each base folder difference is thus a backtrack
+ baseParts = base.split('/');
+ var uriParts = uri.split('/');
+ out = '';
+ while (baseParts.shift())
+ out += '../';
+
+ // finally add uri parts
+ while (curPart = uriParts.shift())
+ out += curPart + '/';
+
+ return out.substr(0, out.length - 1);
+ };
+
+ var normalizeCSS = function(source, fromBase, toBase) {
+
+ fromBase = removeDoubleSlashes(fromBase);
+ toBase = removeDoubleSlashes(toBase);
+
+ var urlRegEx = /@import\s*("([^"]*)"|'([^']*)')|url\s*\((?!#)\s*(\s*"([^"]*)"|'([^']*)'|[^\)]*\s*)\s*\)/ig;
+ var result, url, source;
+
+ while (result = urlRegEx.exec(source)) {
+ url = result[3] || result[2] || result[5] || result[6] || result[4];
+ var newUrl;
+ newUrl = convertURIBase(url, fromBase, toBase);
+ var quoteLen = result[5] || result[6] ? 1 : 0;
+ source = source.substr(0, urlRegEx.lastIndex - url.length - quoteLen - 1) + newUrl + source.substr(urlRegEx.lastIndex - quoteLen - 1);
+ urlRegEx.lastIndex = urlRegEx.lastIndex + (newUrl.length - url.length);
+ }
+
+ return source;
+ };
+
+ normalizeCSS.convertURIBase = convertURIBase;
+ normalizeCSS.absoluteURI = absoluteURI;
+ normalizeCSS.relativeURI = relativeURI;
+
+ return normalizeCSS;
+});
+//>>excludeEnd('excludeRequireCss')
diff --git a/lib/package.js b/lib/package.js
index 0cf03dc8..54cac019 100644
--- a/lib/package.js
+++ b/lib/package.js
@@ -1,12 +1,12 @@
"use strict";
var indexTemplate,
- amdBuilder = require( "builder-amd" ),
+ amdBuilder = require( "./builder-amd" ),
banner = require( "./banner" ),
extend = require( "util" )._extend,
fs = require( "node:fs" ),
handlebars = require( "handlebars" ),
- jqueryCssBuilder = require( "builder-jquery-css" ),
+ jqueryCssBuilder = require( "./builder-jquery-css" ),
path = require( "node:path" ),
sqwish = require( "sqwish" ),
ThemeRoller = require( "./themeroller" ),
diff --git a/lib/requirejs-memfiles.js b/lib/requirejs-memfiles.js
new file mode 100644
index 00000000..e0f9279f
--- /dev/null
+++ b/lib/requirejs-memfiles.js
@@ -0,0 +1,205 @@
+/**
+ * requirejs with an additional static method `requirejs.setFiles()` that
+ * allows for passing in-memory files. Ideal for applications that build
+ * bundles on the fly.
+ */
+
+"use strict";
+
+var fileApi, files, mutexLock, prim, queue,
+ path = require( "path" ),
+ requirejs = require( "requirejs" );
+
+fileApi = {
+ backSlashRegExp: /\\/g,
+ exclusionRegExp: /^\./,
+
+ absPath: function( /* fileName */ ) {
+ // path.charAt( 0 ) must be / or requirejs' nameToUrl will be calculated wrong.
+ return "/";
+ },
+
+ copyDir: function( srcDir, destDir, regExpFilter ) {
+ var destPaths;
+ srcDir = path.normalize( srcDir );
+ destDir = path.normalize( destDir );
+ destPaths = fileApi.getFilteredFileList( srcDir, regExpFilter ).map( function( src ) {
+ var dest = src.replace( srcDir, destDir );
+ fileApi.copyFile( src, dest );
+ return dest;
+ } );
+ return destPaths.length ? destPaths : null;
+ },
+
+ copyFile: function( src, dest ) {
+
+ // Ignore root slash
+ src = src.substr( 1 );
+ dest = dest.substr( 1 );
+
+ files[ dest ] = files[ src ];
+ return true;
+ },
+
+ deleteFile: function( path ) {
+
+ // Ignore root slash
+ path = path.substr( 1 );
+ delete files[ path ];
+ },
+
+ exists: function( path ) {
+
+ // Ignore root slash
+ path = path.substr( 1 );
+ return path in files;
+ },
+
+ getFilteredFileList: function( startDir, regExpFilters /*, makeUnixPaths */ ) {
+ var regExp, regExpInclude, regExpExclude;
+
+ regExpInclude = regExpFilters.include || regExpFilters;
+ regExpExclude = regExpFilters.exclude || null;
+
+ if ( regExpExclude ) {
+ throw new Error( "exclude filter not supported" );
+ }
+
+ regExp = new RegExp( path.join( startDir, ".*" ) + ( regExpInclude ).toString().replace( /^\//, "" ).replace( /\/$/, "" ) );
+
+ return Object.keys( files ).filter( function( path ) {
+ return regExp.test( "/" + path );
+ } ).map( function( path ) {
+ return "/" + path;
+ } );
+ },
+
+ normalize: function( fileName ) {
+ return path.normalize( fileName );
+ },
+
+ readFile: function( path ) {
+
+ // Ignore root slash
+ path = path.substr( 1 );
+
+ try {
+ return files[ path ].toString( "utf8" );
+ } catch ( err ) {
+ err.message = "File not found: " + path + "\n" + err.message;
+ throw err;
+ }
+ },
+
+ readFileAsync: function( path ) {
+ var deferred = prim();
+ try {
+ deferred.resolve( fileApi.readFile( path ) );
+ } catch ( error ) {
+ deferred.reject( error );
+ }
+ return deferred.promise;
+ },
+
+ renameFile: function( from, to ) {
+ from = path.normalize( from );
+ to = path.normalize( to );
+
+ fileApi.copyFile( from, to );
+
+ // Ignore root slash
+ from = from.substr( 1 );
+
+ delete files[ from ];
+ return true;
+ },
+
+ saveFile: function( _path, data ) {
+ _path = path.normalize( _path );
+
+ // Ignore root slash
+ _path = _path.substr( 1 );
+
+ files[ _path ] = data;
+ },
+
+ saveUtf8File: function( fileName, fileContents ) {
+ fileApi.saveFile( fileName, fileContents );
+ }
+};
+
+queue = [];
+
+function enqueue() {
+ queue.push( arguments );
+ if ( queue.length === 1 ) {
+ run();
+ }
+}
+
+function dequeue() {
+ queue.shift();
+ run();
+}
+
+function run() {
+ var args = queue[ 0 ];
+ if ( args !== undefined ) {
+ setFiles.apply( {}, args );
+ }
+}
+
+function setFiles( _files, callback ) {
+
+ if ( mutexLock ) {
+ return callback( new Error( "Internal bug: concurrent calls not supported" ) );
+ }
+ mutexLock = true;
+
+ requirejs.define( "node/file", [ "prim" ], function( _prim ) {
+ prim = _prim;
+ return fileApi;
+ } );
+
+ files = _files;
+ callback( function() {
+ files = {};
+ mutexLock = false;
+ dequeue();
+ } );
+
+}
+
+/**
+ * requirejs.setFiles( files, callback )
+ *
+ * @files [Object] containing (path, data) key-value pairs, e.g.:
+ * {
+ * : ,
+ * : ,
+ * ...
+ * }
+ *
+ * @callback [Function] called with one argument: a callback function that must be called when
+ * use is complete.
+ *
+ * Example:
+ * ```javascript
+ * requirejs.setFiles( files, function( done ) {
+ * requirejs.optmize( config, function() {
+ * doSomething();
+ * done();
+ * }, function( error ) {
+ * doSomething( error );
+ * done();
+ * });
+ * });
+ *
+ * ```
+ *
+ */
+requirejs.setFiles = function( files, callback ) {
+ enqueue( files, callback );
+};
+
+module.exports = requirejs;
diff --git a/package-lock.json b/package-lock.json
index eea6a9d8..17af5bed 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,34 +9,33 @@
"version": "2.4.8",
"license": "MIT",
"dependencies": {
- "@swc/core": "1.11.5",
- "async": "3.2.6",
- "builder-amd": "0.0.3",
- "builder-jquery-css": "0.0.4",
- "cross-spawn": "7.0.6",
- "express": "^4.21.2",
+ "@swc/core": "^1.15.18",
+ "async": "^3.2.6",
+ "cross-spawn": "^7.0.6",
+ "express": "^5.2.1",
"fast-glob": "^3.3.3",
- "formidable": "3.5.4",
- "handlebars": "4.7.8",
- "lzma": "2.3.2",
- "node-packager": "0.0.7",
- "semver": "^7.7.1",
- "sqwish": "0.2.2",
- "winston": "^3.17.0",
- "wolfy87-eventemitter": "5.2.9"
+ "formidable": "^3.5.4",
+ "handlebars": "^4.7.8",
+ "lzma": "^2.3.2",
+ "node-packager": "^0.0.7",
+ "requirejs": "^2.3.8",
+ "semver": "^7.7.4",
+ "sqwish": "^0.2.2",
+ "winston": "^3.19.0",
+ "wolfy87-eventemitter": "^5.2.9"
},
"devDependencies": {
- "eslint": "9.21.0",
+ "eslint": "10.0.3",
"eslint-config-jquery": "3.0.2",
- "globals": "^16.0.0",
+ "globals": "17.4.0",
"grunt": "1.6.1",
"grunt-check-modules": "1.1.0",
"grunt-contrib-clean": "2.0.1",
"grunt-contrib-copy": "1.0.0",
"grunt-contrib-handlebars": "3.0.0",
- "grunt-eslint": "25.0.0",
- "pngjs": "^7.0.0",
- "qunit": "^2.24.1"
+ "grunt-eslint": "26.0.0",
+ "pngjs": "7.0.0",
+ "qunit": "2.25.0"
},
"engines": {
"node": ">=18"
@@ -52,20 +51,20 @@
}
},
"node_modules/@dabh/diagnostics": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz",
- "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==",
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz",
+ "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==",
"license": "MIT",
"dependencies": {
- "colorspace": "1.1.x",
+ "@so-ric/colorspace": "^1.1.6",
"enabled": "2.0.x",
"kuler": "^2.0.0"
}
},
"node_modules/@eslint-community/eslint-utils": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz",
- "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==",
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
+ "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -95,9 +94,9 @@
}
},
"node_modules/@eslint-community/regexpp": {
- "version": "4.12.1",
- "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
- "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
+ "version": "4.12.2",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
+ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
"dev": true,
"license": "MIT",
"engines": {
@@ -105,86 +104,61 @@
}
},
"node_modules/@eslint/config-array": {
- "version": "0.19.2",
- "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz",
- "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==",
+ "version": "0.23.3",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.3.tgz",
+ "integrity": "sha512-j+eEWmB6YYLwcNOdlwQ6L2OsptI/LO6lNBuLIqe5R7RetD658HLoF+Mn7LzYmAWWNNzdC6cqP+L6r8ujeYXWLw==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@eslint/object-schema": "^2.1.6",
+ "@eslint/object-schema": "^3.0.3",
"debug": "^4.3.1",
- "minimatch": "^3.1.2"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
- "node_modules/@eslint/config-array/node_modules/debug": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
+ "minimatch": "^10.2.4"
},
"engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
+ "node": "^20.19.0 || ^22.13.0 || >=24"
}
},
- "node_modules/@eslint/config-array/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "node_modules/@eslint/config-helpers": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.3.tgz",
+ "integrity": "sha512-lzGN0onllOZCGroKJmRwY6QcEHxbjBw1gwB8SgRSqK8YbbtEXMvKynsXc3553ckIEBxsbMBU7oOZXKIPGZNeZw==",
"dev": true,
- "license": "ISC",
+ "license": "Apache-2.0",
"dependencies": {
- "brace-expansion": "^1.1.7"
+ "@eslint/core": "^1.1.1"
},
"engines": {
- "node": "*"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
}
},
- "node_modules/@eslint/config-array/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/@eslint/core": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz",
- "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.1.1.tgz",
+ "integrity": "sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"@types/json-schema": "^7.0.15"
},
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
}
},
"node_modules/@eslint/eslintrc": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.0.tgz",
- "integrity": "sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==",
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz",
+ "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "ajv": "^6.12.4",
+ "ajv": "^6.14.0",
"debug": "^4.3.2",
"espree": "^10.0.1",
"globals": "^14.0.0",
"ignore": "^5.2.0",
"import-fresh": "^3.2.1",
- "js-yaml": "^4.1.0",
- "minimatch": "^3.1.2",
+ "js-yaml": "^4.1.1",
+ "minimatch": "^3.1.5",
"strip-json-comments": "^3.1.1"
},
"engines": {
@@ -201,22 +175,53 @@
"dev": true,
"license": "Python-2.0"
},
- "node_modules/@eslint/eslintrc/node_modules/debug": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "node_modules/@eslint/eslintrc/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@eslint/eslintrc/node_modules/brace-expansion": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
+ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "ms": "^2.1.3"
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/eslint-visitor-keys": {
+ "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==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/espree": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+ "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.15.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^4.2.1"
},
"engines": {
- "node": ">=6.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
"node_modules/@eslint/eslintrc/node_modules/globals": {
@@ -246,9 +251,9 @@
}
},
"node_modules/@eslint/eslintrc/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -258,58 +263,41 @@
"node": "*"
}
},
- "node_modules/@eslint/eslintrc/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/@eslint/js": {
- "version": "9.21.0",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.21.0.tgz",
- "integrity": "sha512-BqStZ3HX8Yz6LvsF5ByXYrtigrV5AXADWLAGc7PH/1SxOb7/FIYYMszZZWiUou/GB9P2lXWk2SV4d+Z8h0nknw==",
+ "version": "9.39.4",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz",
+ "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==",
"dev": true,
"license": "MIT",
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
}
},
"node_modules/@eslint/object-schema": {
- "version": "2.1.6",
- "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz",
- "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==",
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.3.tgz",
+ "integrity": "sha512-iM869Pugn9Nsxbh/YHRqYiqd23AmIbxJOcpUMOuWCVNdoQJ5ZtwL6h3t0bcZzJUlC3Dq9jCFCESBZnX0GTv7iQ==",
"dev": true,
"license": "Apache-2.0",
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
}
},
"node_modules/@eslint/plugin-kit": {
- "version": "0.2.8",
- "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz",
- "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==",
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.6.1.tgz",
+ "integrity": "sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@eslint/core": "^0.13.0",
+ "@eslint/core": "^1.1.1",
"levn": "^0.4.1"
},
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
- "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": {
- "version": "0.13.0",
- "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz",
- "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@types/json-schema": "^7.0.15"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
}
},
"node_modules/@humanfs/core": {
@@ -323,33 +311,19 @@
}
},
"node_modules/@humanfs/node": {
- "version": "0.16.6",
- "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz",
- "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==",
+ "version": "0.16.7",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz",
+ "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"@humanfs/core": "^0.19.1",
- "@humanwhocodes/retry": "^0.3.0"
+ "@humanwhocodes/retry": "^0.4.0"
},
"engines": {
"node": ">=18.18.0"
}
},
- "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz",
- "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=18.18"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/nzakas"
- }
- },
"node_modules/@humanwhocodes/module-importer": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
@@ -365,9 +339,9 @@
}
},
"node_modules/@humanwhocodes/retry": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz",
- "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==",
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
"dev": true,
"license": "Apache-2.0",
"engines": {
@@ -396,9 +370,9 @@
}
},
"node_modules/@isaacs/cliui/node_modules/ansi-regex": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
- "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
+ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
"license": "MIT",
"engines": {
"node": ">=12"
@@ -408,12 +382,12 @@
}
},
"node_modules/@isaacs/cliui/node_modules/strip-ansi": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
- "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
+ "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
"license": "MIT",
"dependencies": {
- "ansi-regex": "^6.0.1"
+ "ansi-regex": "^6.2.2"
},
"engines": {
"node": ">=12"
@@ -470,9 +444,9 @@
}
},
"node_modules/@paralleldrive/cuid2": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.2.2.tgz",
- "integrity": "sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==",
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz",
+ "integrity": "sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==",
"license": "MIT",
"dependencies": {
"@noble/hashes": "^1.1.5"
@@ -488,15 +462,25 @@
"node": ">=14"
}
},
+ "node_modules/@so-ric/colorspace": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz",
+ "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==",
+ "license": "MIT",
+ "dependencies": {
+ "color": "^5.0.2",
+ "text-hex": "1.0.x"
+ }
+ },
"node_modules/@swc/core": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.11.5.tgz",
- "integrity": "sha512-EVY7zfpehxhTZXOfy508gb3D78ihoGGmvyiTWtlBPjgIaidP1Xw0naHMD78CWiFlZmeDjKXJufGtsEGOnZdmNA==",
+ "version": "1.15.18",
+ "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.15.18.tgz",
+ "integrity": "sha512-z87aF9GphWp//fnkRsqvtY+inMVPgYW3zSlXH1kJFvRT5H/wiAn+G32qW5l3oEk63KSF1x3Ov0BfHCObAmT8RA==",
"hasInstallScript": true,
"license": "Apache-2.0",
"dependencies": {
"@swc/counter": "^0.1.3",
- "@swc/types": "^0.1.19"
+ "@swc/types": "^0.1.25"
},
"engines": {
"node": ">=10"
@@ -506,19 +490,19 @@
"url": "https://opencollective.com/swc"
},
"optionalDependencies": {
- "@swc/core-darwin-arm64": "1.11.5",
- "@swc/core-darwin-x64": "1.11.5",
- "@swc/core-linux-arm-gnueabihf": "1.11.5",
- "@swc/core-linux-arm64-gnu": "1.11.5",
- "@swc/core-linux-arm64-musl": "1.11.5",
- "@swc/core-linux-x64-gnu": "1.11.5",
- "@swc/core-linux-x64-musl": "1.11.5",
- "@swc/core-win32-arm64-msvc": "1.11.5",
- "@swc/core-win32-ia32-msvc": "1.11.5",
- "@swc/core-win32-x64-msvc": "1.11.5"
+ "@swc/core-darwin-arm64": "1.15.18",
+ "@swc/core-darwin-x64": "1.15.18",
+ "@swc/core-linux-arm-gnueabihf": "1.15.18",
+ "@swc/core-linux-arm64-gnu": "1.15.18",
+ "@swc/core-linux-arm64-musl": "1.15.18",
+ "@swc/core-linux-x64-gnu": "1.15.18",
+ "@swc/core-linux-x64-musl": "1.15.18",
+ "@swc/core-win32-arm64-msvc": "1.15.18",
+ "@swc/core-win32-ia32-msvc": "1.15.18",
+ "@swc/core-win32-x64-msvc": "1.15.18"
},
"peerDependencies": {
- "@swc/helpers": "*"
+ "@swc/helpers": ">=0.5.17"
},
"peerDependenciesMeta": {
"@swc/helpers": {
@@ -527,9 +511,9 @@
}
},
"node_modules/@swc/core-darwin-arm64": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.11.5.tgz",
- "integrity": "sha512-GEd1hzEx0mSGkJYMFMGLnrGgjL2rOsOsuYWyjyiA3WLmhD7o+n/EWBDo6mzD/9aeF8dzSPC0TnW216gJbvrNzA==",
+ "version": "1.15.18",
+ "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.18.tgz",
+ "integrity": "sha512-+mIv7uBuSaywN3C9LNuWaX1jJJ3SKfiJuE6Lr3bd+/1Iv8oMU7oLBjYMluX1UrEPzwN2qCdY6Io0yVicABoCwQ==",
"cpu": [
"arm64"
],
@@ -543,9 +527,9 @@
}
},
"node_modules/@swc/core-darwin-x64": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.11.5.tgz",
- "integrity": "sha512-toz04z9wAClVvQSEY3xzrgyyeWBAfMWcKG4K0ugNvO56h/wczi2ZHRlnAXZW1tghKBk3z6MXqa/srfXgNhffKw==",
+ "version": "1.15.18",
+ "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.15.18.tgz",
+ "integrity": "sha512-wZle0eaQhnzxWX5V/2kEOI6Z9vl/lTFEC6V4EWcn+5pDjhemCpQv9e/TDJ0GIoiClX8EDWRvuZwh+Z3dhL1NAg==",
"cpu": [
"x64"
],
@@ -559,9 +543,9 @@
}
},
"node_modules/@swc/core-linux-arm-gnueabihf": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.11.5.tgz",
- "integrity": "sha512-5SjmKxXdwbBpsYGTpgeXOXMIjS563/ntRGn8Zc12H/c4VfPrRLGhgbJ/48z2XVFyBLcw7BCHZyFuVX1+ZI3W0Q==",
+ "version": "1.15.18",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.18.tgz",
+ "integrity": "sha512-ao61HGXVqrJFHAcPtF4/DegmwEkVCo4HApnotLU8ognfmU8x589z7+tcf3hU+qBiU1WOXV5fQX6W9Nzs6hjxDw==",
"cpu": [
"arm"
],
@@ -575,9 +559,9 @@
}
},
"node_modules/@swc/core-linux-arm64-gnu": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.11.5.tgz",
- "integrity": "sha512-pydIlInHRzRIwB0NHblz3Dx58H/bsi0I5F2deLf9iOmwPNuOGcEEZF1Qatc7YIjP5DFbXK+Dcz+pMUZb2cc2MQ==",
+ "version": "1.15.18",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.18.tgz",
+ "integrity": "sha512-3xnctOBLIq3kj8PxOCgPrGjBLP/kNOddr6f5gukYt/1IZxsITQaU9TDyjeX6jG+FiCIHjCuWuffsyQDL5Ew1bg==",
"cpu": [
"arm64"
],
@@ -591,9 +575,9 @@
}
},
"node_modules/@swc/core-linux-arm64-musl": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.11.5.tgz",
- "integrity": "sha512-LhBHKjkZq5tJF1Lh0NJFpx7ROnCWLckrlIAIdSt9XfOV+zuEXJQOj+NFcM1eNk17GFfFyUMOZyGZxzYq5dveEQ==",
+ "version": "1.15.18",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.18.tgz",
+ "integrity": "sha512-0a+Lix+FSSHBSBOA0XznCcHo5/1nA6oLLjcnocvzXeqtdjnPb+SvchItHI+lfeiuj1sClYPDvPMLSLyXFaiIKw==",
"cpu": [
"arm64"
],
@@ -607,9 +591,9 @@
}
},
"node_modules/@swc/core-linux-x64-gnu": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.11.5.tgz",
- "integrity": "sha512-dCi4xkxXlsk5sQYb3i413Cfh7+wMJeBYTvBZTD5xh+/DgRtIcIJLYJ2tNjWC4/C2i5fj+Ze9bKNSdd8weRWZ3A==",
+ "version": "1.15.18",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.18.tgz",
+ "integrity": "sha512-wG9J8vReUlpaHz4KOD/5UE1AUgirimU4UFT9oZmupUDEofxJKYb1mTA/DrMj0s78bkBiNI+7Fo2EgPuvOJfuAA==",
"cpu": [
"x64"
],
@@ -623,9 +607,9 @@
}
},
"node_modules/@swc/core-linux-x64-musl": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.11.5.tgz",
- "integrity": "sha512-K0AC4TreM5Oo/tXNXnE/Gf5+5y/HwUdd7xvUjOpZddcX/RlsbYOKWLgOtA3fdFIuta7XC+vrGKmIhm5l70DSVQ==",
+ "version": "1.15.18",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.18.tgz",
+ "integrity": "sha512-4nwbVvCphKzicwNWRmvD5iBaZj8JYsRGa4xOxJmOyHlMDpsvvJ2OR2cODlvWyGFH6BYL1MfIAK3qph3hp0Az6g==",
"cpu": [
"x64"
],
@@ -639,9 +623,9 @@
}
},
"node_modules/@swc/core-win32-arm64-msvc": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.11.5.tgz",
- "integrity": "sha512-wzum8sYUsvPY7kgUfuqVYTgIPYmBC8KPksoNM1fz5UfhudU0ciQuYvUBD47GIGOevaoxhLkjPH4CB95vh1mJ9w==",
+ "version": "1.15.18",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.18.tgz",
+ "integrity": "sha512-zk0RYO+LjiBCat2RTMHzAWaMky0cra9loH4oRrLKLLNuL+jarxKLFDA8xTZWEkCPLjUTwlRN7d28eDLLMgtUcQ==",
"cpu": [
"arm64"
],
@@ -655,9 +639,9 @@
}
},
"node_modules/@swc/core-win32-ia32-msvc": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.11.5.tgz",
- "integrity": "sha512-lco7mw0TPRTpVPR6NwggJpjdUkAboGRkLrDHjIsUaR+Y5+0m5FMMkHOMxWXAbrBS5c4ph7QErp4Lma4r9Mn5og==",
+ "version": "1.15.18",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.18.tgz",
+ "integrity": "sha512-yVuTrZ0RccD5+PEkpcLOBAuPbYBXS6rslENvIXfvJGXSdX5QGi1ehC4BjAMl5FkKLiam4kJECUI0l7Hq7T1vwg==",
"cpu": [
"ia32"
],
@@ -671,9 +655,9 @@
}
},
"node_modules/@swc/core-win32-x64-msvc": {
- "version": "1.11.5",
- "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.11.5.tgz",
- "integrity": "sha512-E+DApLSC6JRK8VkDa4bNsBdD7Qoomx1HvKVZpOXl9v94hUZI5GMExl4vU5isvb+hPWL7rZ0NeI7ITnVLgLJRbA==",
+ "version": "1.15.18",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.18.tgz",
+ "integrity": "sha512-7NRmE4hmUQNCbYU3Hn9Tz57mK9Qq4c97ZS+YlamlK6qG9Fb5g/BB3gPDe0iLlJkns/sYv2VWSkm8c3NmbEGjbg==",
"cpu": [
"x64"
],
@@ -693,18 +677,25 @@
"license": "Apache-2.0"
},
"node_modules/@swc/types": {
- "version": "0.1.19",
- "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.19.tgz",
- "integrity": "sha512-WkAZaAfj44kh/UFdAQcrMP1I0nwRqpt27u+08LMBYMqmQfwwMofYoMh/48NGkMMRfC4ynpfwRbJuu8ErfNloeA==",
+ "version": "0.1.25",
+ "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.25.tgz",
+ "integrity": "sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==",
"license": "Apache-2.0",
"dependencies": {
"@swc/counter": "^0.1.3"
}
},
+ "node_modules/@types/esrecurse": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz",
+ "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@types/estree": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
- "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
"dev": true,
"license": "MIT"
},
@@ -741,22 +732,22 @@
}
},
"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==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
+ "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
"license": "MIT",
"dependencies": {
- "mime-types": "~2.1.34",
- "negotiator": "0.6.3"
+ "mime-types": "^3.0.0",
+ "negotiator": "^1.0.0"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/acorn": {
- "version": "8.14.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
- "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
+ "version": "8.16.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
+ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
"dev": true,
"license": "MIT",
"bin": {
@@ -777,9 +768,9 @@
}
},
"node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "version": "6.14.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz",
+ "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -849,6 +840,12 @@
"node": ">= 14"
}
},
+ "node_modules/archiver-utils/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "license": "MIT"
+ },
"node_modules/archiver-utils/node_modules/brace-expansion": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
@@ -862,6 +859,7 @@
"version": "10.5.0",
"resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
"integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
+ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
"license": "ISC",
"dependencies": {
"foreground-child": "^3.1.0",
@@ -879,12 +877,12 @@
}
},
"node_modules/archiver-utils/node_modules/minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "version": "9.0.9",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz",
+ "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==",
"license": "ISC",
"dependencies": {
- "brace-expansion": "^2.0.1"
+ "brace-expansion": "^2.0.2"
},
"engines": {
"node": ">=16 || 14 >=14.17"
@@ -913,12 +911,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-slice": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz",
@@ -942,23 +934,115 @@
"license": "MIT"
},
"node_modules/b4a": {
- "version": "1.6.7",
- "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz",
- "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==",
- "license": "Apache-2.0"
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz",
+ "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==",
+ "license": "Apache-2.0",
+ "peerDependencies": {
+ "react-native-b4a": "*"
+ },
+ "peerDependenciesMeta": {
+ "react-native-b4a": {
+ "optional": true
+ }
+ }
},
"node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "license": "MIT"
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
},
"node_modules/bare-events": {
- "version": "2.5.4",
- "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz",
- "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==",
+ "version": "2.8.2",
+ "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz",
+ "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==",
+ "license": "Apache-2.0",
+ "peerDependencies": {
+ "bare-abort-controller": "*"
+ },
+ "peerDependenciesMeta": {
+ "bare-abort-controller": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/bare-fs": {
+ "version": "4.5.5",
+ "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.5.tgz",
+ "integrity": "sha512-XvwYM6VZqKoqDll8BmSww5luA5eflDzY0uEFfBJtFKe4PAAtxBjU3YIxzIBzhyaEQBy1VXEQBto4cpN5RZJw+w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "bare-events": "^2.5.4",
+ "bare-path": "^3.0.0",
+ "bare-stream": "^2.6.4",
+ "bare-url": "^2.2.2",
+ "fast-fifo": "^1.3.2"
+ },
+ "engines": {
+ "bare": ">=1.16.0"
+ },
+ "peerDependencies": {
+ "bare-buffer": "*"
+ },
+ "peerDependenciesMeta": {
+ "bare-buffer": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/bare-os": {
+ "version": "3.7.1",
+ "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.7.1.tgz",
+ "integrity": "sha512-ebvMaS5BgZKmJlvuWh14dg9rbUI84QeV3WlWn6Ph6lFI8jJoh7ADtVTyD2c93euwbe+zgi0DVrl4YmqXeM9aIA==",
+ "license": "Apache-2.0",
+ "engines": {
+ "bare": ">=1.14.0"
+ }
+ },
+ "node_modules/bare-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz",
+ "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "bare-os": "^3.0.1"
+ }
+ },
+ "node_modules/bare-stream": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.8.1.tgz",
+ "integrity": "sha512-bSeR8RfvbRwDpD7HWZvn8M3uYNDrk7m9DQjYOFkENZlXW8Ju/MPaqUPQq5LqJ3kyjEm07siTaAQ7wBKCU59oHg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "streamx": "^2.21.0",
+ "teex": "^1.0.1"
+ },
+ "peerDependencies": {
+ "bare-buffer": "*",
+ "bare-events": "*"
+ },
+ "peerDependenciesMeta": {
+ "bare-buffer": {
+ "optional": true
+ },
+ "bare-events": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/bare-url": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.3.2.tgz",
+ "integrity": "sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==",
"license": "Apache-2.0",
- "optional": true
+ "dependencies": {
+ "bare-path": "^3.0.0"
+ }
},
"node_modules/base64-js": {
"version": "1.5.1",
@@ -981,37 +1065,40 @@
"license": "MIT"
},
"node_modules/body-parser": {
- "version": "1.20.3",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
- "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz",
+ "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==",
"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.0",
- "iconv-lite": "0.4.24",
- "on-finished": "2.4.1",
- "qs": "6.13.0",
- "raw-body": "2.5.2",
- "type-is": "~1.6.18",
- "unpipe": "1.0.0"
+ "bytes": "^3.1.2",
+ "content-type": "^1.0.5",
+ "debug": "^4.4.3",
+ "http-errors": "^2.0.0",
+ "iconv-lite": "^0.7.0",
+ "on-finished": "^2.4.1",
+ "qs": "^6.14.1",
+ "raw-body": "^3.0.1",
+ "type-is": "^2.0.1"
},
"engines": {
- "node": ">= 0.8",
- "npm": "1.2.8000 || >= 1.4.16"
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
"node_modules/brace-expansion": {
- "version": "1.1.12",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
- "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz",
+ "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
+ "balanced-match": "^4.0.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
}
},
"node_modules/braces": {
@@ -1059,31 +1146,6 @@
"node": ">=8.0.0"
}
},
- "node_modules/builder-amd": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/builder-amd/-/builder-amd-0.0.3.tgz",
- "integrity": "sha512-lT4UBnD7KFkIQ3eRLigK3qAI89pGUFQTBJjSXtLJTHG2o1gdsZ/Jyz5pooqe38yvyYmyjaKCd1uCMeUeYaQHMg==",
- "dependencies": {
- "requirejs-memfiles": ">=2.1.15-3 <=2.1.15"
- }
- },
- "node_modules/builder-amd-css": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/builder-amd-css/-/builder-amd-css-0.0.7.tgz",
- "integrity": "sha512-acxHHS/38AFVQWUT2fVh7BVr4MmfXEZkjntYMB2yWs/CvUudCYW1Nr5OQzIKLRyFbzhRFovpHF13WPahC7a+Iw==",
- "dependencies": {
- "glob": "4.3.5",
- "requirejs-memfiles": ">=2.1.15-3 <=2.1.15"
- }
- },
- "node_modules/builder-jquery-css": {
- "version": "0.0.4",
- "resolved": "https://registry.npmjs.org/builder-jquery-css/-/builder-jquery-css-0.0.4.tgz",
- "integrity": "sha512-humvnWBt3VBrxypzBu0wC0FcIHcaTKy+plzLXyYQc84qGputSaYDMqlybgJX9uOfRtl5mcTp45q5pl2RTOxUfA==",
- "dependencies": {
- "builder-amd-css": "0.0.x"
- }
- },
"node_modules/bytes": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
@@ -1107,13 +1169,13 @@
}
},
"node_modules/call-bound": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz",
- "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
"license": "MIT",
"dependencies": {
- "call-bind-apply-helpers": "^1.0.1",
- "get-intrinsic": "^1.2.6"
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
},
"engines": {
"node": ">= 0.4"
@@ -1149,39 +1211,60 @@
"node": ">=0.10.0"
}
},
+ "node_modules/chalk/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
"node_modules/color": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz",
- "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==",
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz",
+ "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==",
"license": "MIT",
"dependencies": {
- "color-convert": "^1.9.3",
- "color-string": "^1.6.0"
+ "color-convert": "^3.1.3",
+ "color-string": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=18"
}
},
"node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz",
+ "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==",
"license": "MIT",
"dependencies": {
- "color-name": "1.1.3"
+ "color-name": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=14.6"
}
},
"node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "license": "MIT"
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz",
+ "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20"
+ }
},
"node_modules/color-string": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
- "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz",
+ "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==",
"license": "MIT",
"dependencies": {
- "color-name": "^1.0.0",
- "simple-swizzle": "^0.2.2"
+ "color-name": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
}
},
"node_modules/colors": {
@@ -1194,16 +1277,6 @@
"node": ">=0.1.90"
}
},
- "node_modules/colorspace": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz",
- "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==",
- "license": "MIT",
- "dependencies": {
- "color": "^3.1.3",
- "text-hex": "1.0.x"
- }
- },
"node_modules/commander": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
@@ -1234,18 +1307,20 @@
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true,
"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==",
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz",
+ "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==",
"license": "MIT",
- "dependencies": {
- "safe-buffer": "5.2.1"
- },
"engines": {
- "node": ">= 0.6"
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
"node_modules/content-type": {
@@ -1258,19 +1333,22 @@
}
},
"node_modules/cookie": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
- "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
+ "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.6",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
- "license": "MIT"
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz",
+ "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.6.0"
+ }
},
"node_modules/core-util-is": {
"version": "1.0.3",
@@ -1328,12 +1406,20 @@
}
},
"node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
"license": "MIT",
"dependencies": {
- "ms": "2.0.0"
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
}
},
"node_modules/deep-is": {
@@ -1352,16 +1438,6 @@
"node": ">= 0.8"
}
},
- "node_modules/destroy": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
- "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8",
- "npm": "1.2.8000 || >= 1.4.16"
- }
- },
"node_modules/detect-file": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
@@ -1466,43 +1542,43 @@
"license": "MIT"
},
"node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=0.8.0"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/eslint": {
- "version": "9.21.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.21.0.tgz",
- "integrity": "sha512-KjeihdFqTPhOMXTt7StsDxriV4n66ueuF/jfPNC3j/lduHwr/ijDwJMsF+wyMJethgiKi5wniIE243vi07d3pg==",
+ "version": "10.0.3",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.0.3.tgz",
+ "integrity": "sha512-COV33RzXZkqhG9P2rZCFl9ZmJ7WL+gQSCRzE7RhkbclbQPtLAWReL7ysA0Sh4c8Im2U9ynybdR56PV0XcKvqaQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@eslint-community/eslint-utils": "^4.2.0",
- "@eslint-community/regexpp": "^4.12.1",
- "@eslint/config-array": "^0.19.2",
- "@eslint/core": "^0.12.0",
- "@eslint/eslintrc": "^3.3.0",
- "@eslint/js": "9.21.0",
- "@eslint/plugin-kit": "^0.2.7",
+ "@eslint-community/eslint-utils": "^4.8.0",
+ "@eslint-community/regexpp": "^4.12.2",
+ "@eslint/config-array": "^0.23.3",
+ "@eslint/config-helpers": "^0.5.2",
+ "@eslint/core": "^1.1.1",
+ "@eslint/plugin-kit": "^0.6.1",
"@humanfs/node": "^0.16.6",
"@humanwhocodes/module-importer": "^1.0.1",
"@humanwhocodes/retry": "^0.4.2",
"@types/estree": "^1.0.6",
- "@types/json-schema": "^7.0.15",
- "ajv": "^6.12.4",
- "chalk": "^4.0.0",
+ "ajv": "^6.14.0",
"cross-spawn": "^7.0.6",
"debug": "^4.3.2",
"escape-string-regexp": "^4.0.0",
- "eslint-scope": "^8.2.0",
- "eslint-visitor-keys": "^4.2.0",
- "espree": "^10.3.0",
- "esquery": "^1.5.0",
+ "eslint-scope": "^9.1.2",
+ "eslint-visitor-keys": "^5.0.1",
+ "espree": "^11.1.1",
+ "esquery": "^1.7.0",
"esutils": "^2.0.2",
"fast-deep-equal": "^3.1.3",
"file-entry-cache": "^8.0.0",
@@ -1512,8 +1588,7 @@
"imurmurhash": "^0.1.4",
"is-glob": "^4.0.0",
"json-stable-stringify-without-jsonify": "^1.0.1",
- "lodash.merge": "^4.6.2",
- "minimatch": "^3.1.2",
+ "minimatch": "^10.2.4",
"natural-compare": "^1.4.0",
"optionator": "^0.9.3"
},
@@ -1521,7 +1596,7 @@
"eslint": "bin/eslint.js"
},
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
},
"funding": {
"url": "https://eslint.org/donate"
@@ -1543,178 +1618,50 @@
"license": "MIT"
},
"node_modules/eslint-scope": {
- "version": "8.2.0",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz",
- "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==",
+ "version": "9.1.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz",
+ "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
+ "@types/esrecurse": "^4.3.1",
+ "@types/estree": "^1.0.8",
"esrecurse": "^4.3.0",
"estraverse": "^5.2.0"
},
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
"node_modules/eslint-visitor-keys": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
- "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
+ "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==",
"dev": true,
"license": "Apache-2.0",
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
- "node_modules/eslint/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/eslint/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/eslint/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/eslint/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/eslint/node_modules/debug": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/eslint/node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eslint/node_modules/glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "is-glob": "^4.0.3"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/eslint/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/eslint/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/eslint/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/espree": {
- "version": "10.3.0",
- "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz",
- "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==",
+ "version": "11.2.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz",
+ "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
- "acorn": "^8.14.0",
+ "acorn": "^8.16.0",
"acorn-jsx": "^5.3.2",
- "eslint-visitor-keys": "^4.2.0"
+ "eslint-visitor-keys": "^5.0.1"
},
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
},
"funding": {
"url": "https://opencollective.com/eslint"
@@ -1735,9 +1682,9 @@
}
},
"node_modules/esquery": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
- "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz",
+ "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
@@ -1814,6 +1761,15 @@
"node": ">=0.8.x"
}
},
+ "node_modules/events-universal": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz",
+ "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "bare-events": "^2.7.0"
+ }
+ },
"node_modules/exit": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
@@ -1837,66 +1793,48 @@
}
},
"node_modules/express": {
- "version": "4.22.1",
- "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz",
- "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==",
- "license": "MIT",
- "dependencies": {
- "accepts": "~1.3.8",
- "array-flatten": "1.1.1",
- "body-parser": "~1.20.3",
- "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.14.0",
- "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"
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz",
+ "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==",
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "^2.0.0",
+ "body-parser": "^2.2.1",
+ "content-disposition": "^1.0.0",
+ "content-type": "^1.0.5",
+ "cookie": "^0.7.1",
+ "cookie-signature": "^1.2.1",
+ "debug": "^4.4.0",
+ "depd": "^2.0.0",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "etag": "^1.8.1",
+ "finalhandler": "^2.1.0",
+ "fresh": "^2.0.0",
+ "http-errors": "^2.0.0",
+ "merge-descriptors": "^2.0.0",
+ "mime-types": "^3.0.0",
+ "on-finished": "^2.4.1",
+ "once": "^1.4.0",
+ "parseurl": "^1.3.3",
+ "proxy-addr": "^2.0.7",
+ "qs": "^6.14.0",
+ "range-parser": "^1.2.1",
+ "router": "^2.2.0",
+ "send": "^1.1.0",
+ "serve-static": "^2.2.0",
+ "statuses": "^2.0.1",
+ "type-is": "^2.0.1",
+ "vary": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 18"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/express"
}
},
- "node_modules/express/node_modules/qs": {
- "version": "6.14.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
- "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
- "license": "BSD-3-Clause",
- "dependencies": {
- "side-channel": "^1.1.0"
- },
- "engines": {
- "node": ">=0.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/extend": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
@@ -1933,6 +1871,18 @@
"node": ">=8.6.0"
}
},
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"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",
@@ -1948,9 +1898,9 @@
"license": "MIT"
},
"node_modules/fastq": {
- "version": "1.19.1",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
- "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
+ "version": "1.20.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
+ "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
"license": "ISC",
"dependencies": {
"reusify": "^1.0.4"
@@ -1995,21 +1945,24 @@
}
},
"node_modules/finalhandler": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
- "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz",
+ "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==",
"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.1",
- "unpipe": "~1.0.0"
+ "debug": "^4.4.0",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "on-finished": "^2.4.1",
+ "parseurl": "^1.3.3",
+ "statuses": "^2.0.1"
},
"engines": {
- "node": ">= 0.8"
+ "node": ">= 18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
"node_modules/find-up": {
@@ -2087,9 +2040,9 @@
}
},
"node_modules/flatted": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
- "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.1.tgz",
+ "integrity": "sha512-IxfVbRFVlV8V/yRaGzk0UVIcsKKHMSfYw66T/u4nTwlWteQePsxe//LjudR1AMX4tZW3WFCh3Zqa/sjlqpbURQ==",
"dev": true,
"license": "ISC"
},
@@ -2165,12 +2118,12 @@
}
},
"node_modules/fresh": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
- "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
+ "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
"license": "MIT",
"engines": {
- "node": ">= 0.6"
+ "node": ">= 0.8"
}
},
"node_modules/fs.realpath": {
@@ -2236,31 +2189,69 @@
}
},
"node_modules/glob": {
- "version": "4.3.5",
- "resolved": "https://registry.npmjs.org/glob/-/glob-4.3.5.tgz",
- "integrity": "sha512-kOq1ncUyUvkZdl7BgKa3n6zAOiN05pzleOxESuc8bFoXKRhYsrZM6z79O5DKe9JGChHhSZloUsD/hZrUXByxgQ==",
- "deprecated": "Glob versions prior to v9 are no longer supported",
+ "version": "7.1.7",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
+ "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
+ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
+ "dev": true,
"license": "ISC",
"dependencies": {
+ "fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
- "minimatch": "^2.0.1",
- "once": "^1.3.0"
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
},
"engines": {
"node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
"license": "ISC",
"dependencies": {
- "is-glob": "^4.0.1"
+ "is-glob": "^4.0.3"
},
"engines": {
- "node": ">= 6"
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/glob/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/glob/node_modules/brace-expansion": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
+ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
}
},
"node_modules/global-modules": {
@@ -2309,9 +2300,9 @@
}
},
"node_modules/globals": {
- "version": "16.0.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-16.0.0.tgz",
- "integrity": "sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==",
+ "version": "17.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-17.4.0.tgz",
+ "integrity": "sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2536,82 +2527,286 @@
"has-flag": "^4.0.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=8"
+ }
+ },
+ "node_modules/grunt-eslint": {
+ "version": "26.0.0",
+ "resolved": "https://registry.npmjs.org/grunt-eslint/-/grunt-eslint-26.0.0.tgz",
+ "integrity": "sha512-HP/Mu00nBtdLDk0i1V1gLplYBgce4nBjxwmtpo3Eit/h5OUzGxEsgBxprkT4I5bN1x79w6wDnrN+7CX29OZatg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.1.2",
+ "eslint": "^9.22.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ },
+ "peerDependencies": {
+ "grunt": ">=1"
+ }
+ },
+ "node_modules/grunt-eslint/node_modules/@eslint/config-array": {
+ "version": "0.21.2",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz",
+ "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/object-schema": "^2.1.7",
+ "debug": "^4.3.1",
+ "minimatch": "^3.1.5"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/grunt-eslint/node_modules/@eslint/config-helpers": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz",
+ "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.17.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/grunt-eslint/node_modules/@eslint/core": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz",
+ "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.15"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/grunt-eslint/node_modules/@eslint/object-schema": {
+ "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==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/grunt-eslint/node_modules/@eslint/plugin-kit": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz",
+ "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.17.0",
+ "levn": "^0.4.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/grunt-eslint/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/grunt-eslint/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/grunt-eslint/node_modules/brace-expansion": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
+ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/grunt-eslint/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/grunt-eslint/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/grunt-eslint/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/grunt-eslint/node_modules/eslint": {
+ "version": "9.39.4",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz",
+ "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.8.0",
+ "@eslint-community/regexpp": "^4.12.1",
+ "@eslint/config-array": "^0.21.2",
+ "@eslint/config-helpers": "^0.4.2",
+ "@eslint/core": "^0.17.0",
+ "@eslint/eslintrc": "^3.3.5",
+ "@eslint/js": "9.39.4",
+ "@eslint/plugin-kit": "^0.4.1",
+ "@humanfs/node": "^0.16.6",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@humanwhocodes/retry": "^0.4.2",
+ "@types/estree": "^1.0.6",
+ "ajv": "^6.14.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.6",
+ "debug": "^4.3.2",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^8.4.0",
+ "eslint-visitor-keys": "^4.2.1",
+ "espree": "^10.4.0",
+ "esquery": "^1.5.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^8.0.0",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.5",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "jiti": "*"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ }
}
},
- "node_modules/grunt-eslint": {
- "version": "25.0.0",
- "resolved": "https://registry.npmjs.org/grunt-eslint/-/grunt-eslint-25.0.0.tgz",
- "integrity": "sha512-JIV5IPgOuacorFLmYtUTq0n+0qGIL9FSQJ4KVnNfCg/8Fm+K1t6OWrzXXI8TxWTwq2K9E3parFVXCpn1sGLbKQ==",
+ "node_modules/grunt-eslint/node_modules/eslint-scope": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
+ "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
"dev": true,
- "license": "MIT",
+ "license": "BSD-2-Clause",
"dependencies": {
- "chalk": "^4.1.2",
- "eslint": "^9.0.0"
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- },
- "peerDependencies": {
- "grunt": ">=1"
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/grunt-eslint/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "node_modules/grunt-eslint/node_modules/eslint-visitor-keys": {
+ "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==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
+ "license": "Apache-2.0",
"engines": {
- "node": ">=8"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/grunt-eslint/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "node_modules/grunt-eslint/node_modules/espree": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+ "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
"dev": true,
- "license": "MIT",
+ "license": "BSD-2-Clause",
"dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
+ "acorn": "^8.15.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^4.2.1"
},
"engines": {
- "node": ">=10"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/grunt-eslint/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "node_modules/grunt-eslint/node_modules/minimatch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"dependencies": {
- "color-name": "~1.1.4"
+ "brace-expansion": "^1.1.7"
},
"engines": {
- "node": ">=7.0.0"
+ "node": "*"
}
},
- "node_modules/grunt-eslint/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/grunt-eslint/node_modules/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@@ -2750,26 +2945,22 @@
"node": ">=10"
}
},
- "node_modules/grunt/node_modules/glob": {
- "version": "7.1.7",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
- "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
- "deprecated": "Glob versions prior to v9 are no longer supported",
+ "node_modules/grunt/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"dev": true,
- "license": "ISC",
+ "license": "MIT"
+ },
+ "node_modules/grunt/node_modules/brace-expansion": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
+ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
}
},
"node_modules/grunt/node_modules/iconv-lite": {
@@ -2889,31 +3080,39 @@
}
},
"node_modules/http-errors": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
- "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "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.1",
- "toidentifier": "1.0.1"
+ "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/iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz",
+ "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==",
"license": "MIT",
"dependencies": {
- "safer-buffer": ">= 2.1.2 < 3"
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
},
"engines": {
"node": ">=0.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
"node_modules/ieee754": {
@@ -2978,6 +3177,7 @@
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
"deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+ "dev": true,
"license": "ISC",
"dependencies": {
"once": "^1.3.0",
@@ -3027,12 +3227,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/is-arrayish": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
- "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
- "license": "MIT"
- },
"node_modules/is-core-module": {
"version": "2.16.1",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
@@ -3101,6 +3295,12 @@
"node": ">=0.10.0"
}
},
+ "node_modules/is-promise": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
+ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
+ "license": "MIT"
+ },
"node_modules/is-relative": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
@@ -3385,12 +3585,6 @@
"node": ">= 12.0.0"
}
},
- "node_modules/logform/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "license": "MIT"
- },
"node_modules/lru-cache": {
"version": "10.4.3",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
@@ -3439,19 +3633,22 @@
}
},
"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==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz",
+ "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==",
"license": "MIT",
"engines": {
- "node": ">= 0.6"
+ "node": ">= 0.8"
}
},
"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==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz",
+ "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==",
"license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
@@ -3465,15 +3662,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",
@@ -3487,50 +3675,45 @@
"node": ">=8.6"
}
},
- "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",
- "bin": {
- "mime": "cli.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/mime-db": {
- "version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "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/mime-types": {
- "version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "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.52.0"
+ "mime-db": "^1.54.0"
},
"engines": {
- "node": ">= 0.6"
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
"node_modules/minimatch": {
- "version": "2.0.10",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz",
- "integrity": "sha512-jQo6o1qSVLEWaw3l+bwYA2X0uLuK2KjNh2wjgO7Q/9UJnXr1Q3yQKR8BI0/Bt/rPg75e6SMW4hW/6cBHVTZUjA==",
- "deprecated": "Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue",
- "license": "ISC",
+ "version": "10.2.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz",
+ "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "brace-expansion": "^1.0.0"
+ "brace-expansion": "^5.0.2"
},
"engines": {
- "node": "*"
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/minimist": {
@@ -3543,18 +3726,18 @@
}
},
"node_modules/minipass": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
- "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
- "license": "ISC",
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
+ "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==",
+ "license": "BlueOak-1.0.0",
"engines": {
"node": ">=16 || 14 >=14.17"
}
},
"node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"license": "MIT"
},
"node_modules/natural-compare": {
@@ -3565,9 +3748,9 @@
"license": "MIT"
},
"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==",
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
+ "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
"license": "MIT",
"engines": {
"node": ">= 0.6"
@@ -3923,10 +4106,14 @@
}
},
"node_modules/path-to-regexp": {
- "version": "0.1.12",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
- "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
- "license": "MIT"
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz",
+ "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
},
"node_modules/picomatch": {
"version": "2.3.1",
@@ -3999,12 +4186,12 @@
}
},
"node_modules/qs": {
- "version": "6.13.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
- "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
+ "version": "6.15.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz",
+ "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==",
"license": "BSD-3-Clause",
"dependencies": {
- "side-channel": "^1.0.6"
+ "side-channel": "^1.1.0"
},
"engines": {
"node": ">=0.6"
@@ -4034,9 +4221,9 @@
"license": "MIT"
},
"node_modules/qunit": {
- "version": "2.24.1",
- "resolved": "https://registry.npmjs.org/qunit/-/qunit-2.24.1.tgz",
- "integrity": "sha512-Eu0k/5JDjx0QnqxsE1WavnDNDgL1zgMZKsMw/AoAxnsl9p4RgyLODyo2N7abZY7CEAnvl5YUqFZdkImzbgXzSg==",
+ "version": "2.25.0",
+ "resolved": "https://registry.npmjs.org/qunit/-/qunit-2.25.0.tgz",
+ "integrity": "sha512-MONPKgjavgTqArCwZOEz8nEMbA19zNXIp5ZOW9rPYj5cbgQp0fiI36c9dPTSzTRRzx+KcfB5eggYB/ENqxi0+w==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4061,18 +4248,18 @@
}
},
"node_modules/raw-body": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
- "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz",
+ "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==",
"license": "MIT",
"dependencies": {
- "bytes": "3.1.2",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "unpipe": "1.0.0"
+ "bytes": "~3.1.2",
+ "http-errors": "~2.0.1",
+ "iconv-lite": "~0.7.0",
+ "unpipe": "~1.0.0"
},
"engines": {
- "node": ">= 0.8"
+ "node": ">= 0.10"
}
},
"node_modules/readable-stream": {
@@ -4100,6 +4287,12 @@
"minimatch": "^5.1.0"
}
},
+ "node_modules/readdir-glob/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "license": "MIT"
+ },
"node_modules/readdir-glob/node_modules/brace-expansion": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
@@ -4110,9 +4303,9 @@
}
},
"node_modules/readdir-glob/node_modules/minimatch": {
- "version": "5.1.6",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
- "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "version": "5.1.9",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz",
+ "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==",
"license": "ISC",
"dependencies": {
"brace-expansion": "^2.0.1"
@@ -4135,32 +4328,26 @@
}
},
"node_modules/requirejs": {
- "version": "2.1.15",
- "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.1.15.tgz",
- "integrity": "sha512-nofVLcptE+jWPtIaVfC6q2ddPdhSj+5eKGdPO02bXJWKfLQdFTgKE9l8abE8bRVvTr/1TmCTLfxzJT6pNsvUaA==",
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.8.tgz",
+ "integrity": "sha512-7/cTSLOdYkNBNJcDMWf+luFvMriVm7eYxp4BcFCsAX0wF421Vyce5SXP17c+Jd5otXKGNehIonFlyQXSowL6Mw==",
+ "license": "MIT",
"bin": {
+ "r_js": "bin/r.js",
"r.js": "bin/r.js"
},
"engines": {
"node": ">=0.4.0"
}
},
- "node_modules/requirejs-memfiles": {
- "version": "2.1.15-3",
- "resolved": "https://registry.npmjs.org/requirejs-memfiles/-/requirejs-memfiles-2.1.15-3.tgz",
- "integrity": "sha512-SShyaU/imM+y5ToCWPcivTYnYoUNaAwOtZTNm0iLHfunmfFFg28zOlXDf8XgOMpEdNGWo4rkpXFeuUcaMKVbkA==",
- "dependencies": {
- "requirejs": "2.1.15"
- }
- },
"node_modules/resolve": {
- "version": "1.22.10",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
- "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
+ "version": "1.22.11",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz",
+ "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "is-core-module": "^2.16.0",
+ "is-core-module": "^2.16.1",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
},
@@ -4222,39 +4409,20 @@
"rimraf": "bin.js"
}
},
- "node_modules/rimraf/node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "deprecated": "Glob versions prior to v9 are no longer supported",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/rimraf/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "license": "ISC",
+ "node_modules/router": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
+ "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==",
+ "license": "MIT",
"dependencies": {
- "brace-expansion": "^1.1.7"
+ "debug": "^4.4.0",
+ "depd": "^2.0.0",
+ "is-promise": "^4.0.0",
+ "parseurl": "^1.3.3",
+ "path-to-regexp": "^8.0.0"
},
"engines": {
- "node": "*"
+ "node": ">= 18"
}
},
"node_modules/run-parallel": {
@@ -4316,9 +4484,9 @@
"license": "MIT"
},
"node_modules/semver": {
- "version": "7.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
- "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -4328,57 +4496,48 @@
}
},
"node_modules/send": {
- "version": "0.19.0",
- "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
- "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
- "license": "MIT",
- "dependencies": {
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "mime": "1.6.0",
- "ms": "2.1.3",
- "on-finished": "2.4.1",
- "range-parser": "~1.2.1",
- "statuses": "2.0.1"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/send/node_modules/encodeurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz",
+ "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==",
"license": "MIT",
+ "dependencies": {
+ "debug": "^4.4.3",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "etag": "^1.8.1",
+ "fresh": "^2.0.0",
+ "http-errors": "^2.0.1",
+ "mime-types": "^3.0.2",
+ "ms": "^2.1.3",
+ "on-finished": "^2.4.1",
+ "range-parser": "^1.2.1",
+ "statuses": "^2.0.2"
+ },
"engines": {
- "node": ">= 0.8"
+ "node": ">= 18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
- "node_modules/send/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "license": "MIT"
- },
"node_modules/serve-static": {
- "version": "1.16.2",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
- "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz",
+ "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==",
"license": "MIT",
"dependencies": {
- "encodeurl": "~2.0.0",
- "escape-html": "~1.0.3",
- "parseurl": "~1.3.3",
- "send": "0.19.0"
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "parseurl": "^1.3.3",
+ "send": "^1.2.0"
},
"engines": {
- "node": ">= 0.8.0"
+ "node": ">= 18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
"node_modules/setprototypeof": {
@@ -4492,15 +4651,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/simple-swizzle": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
- "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
- "license": "MIT",
- "dependencies": {
- "is-arrayish": "^0.3.1"
- }
- },
"node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@@ -4538,25 +4688,23 @@
}
},
"node_modules/statuses": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "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/streamx": {
- "version": "2.22.0",
- "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz",
- "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==",
+ "version": "2.23.0",
+ "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz",
+ "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==",
"license": "MIT",
"dependencies": {
+ "events-universal": "^1.0.0",
"fast-fifo": "^1.3.2",
"text-decoder": "^1.1.0"
- },
- "optionalDependencies": {
- "bare-events": "^2.2.0"
}
},
"node_modules/string_decoder": {
@@ -4628,9 +4776,9 @@
}
},
"node_modules/string-width/node_modules/ansi-regex": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
- "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
+ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
"license": "MIT",
"engines": {
"node": ">=12"
@@ -4640,12 +4788,12 @@
}
},
"node_modules/string-width/node_modules/strip-ansi": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
- "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
+ "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
"license": "MIT",
"dependencies": {
- "ansi-regex": "^6.0.1"
+ "ansi-regex": "^6.2.2"
},
"engines": {
"node": ">=12"
@@ -4726,20 +4874,30 @@
}
},
"node_modules/tar-stream": {
- "version": "3.1.7",
- "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz",
- "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==",
+ "version": "3.1.8",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.8.tgz",
+ "integrity": "sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==",
"license": "MIT",
"dependencies": {
"b4a": "^1.6.4",
+ "bare-fs": "^4.5.5",
"fast-fifo": "^1.2.0",
"streamx": "^2.15.0"
}
},
+ "node_modules/teex": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz",
+ "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==",
+ "license": "MIT",
+ "dependencies": {
+ "streamx": "^2.12.5"
+ }
+ },
"node_modules/text-decoder": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz",
- "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==",
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz",
+ "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==",
"license": "Apache-2.0",
"dependencies": {
"b4a": "^1.6.4"
@@ -4806,13 +4964,14 @@
}
},
"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==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz",
+ "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==",
"license": "MIT",
"dependencies": {
- "media-typer": "0.3.0",
- "mime-types": "~2.1.24"
+ "content-type": "^1.0.5",
+ "media-typer": "^1.1.0",
+ "mime-types": "^3.0.0"
},
"engines": {
"node": ">= 0.6"
@@ -4887,15 +5046,6 @@
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
"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/v8flags": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz",
@@ -4934,13 +5084,13 @@
}
},
"node_modules/winston": {
- "version": "3.17.0",
- "resolved": "https://registry.npmjs.org/winston/-/winston-3.17.0.tgz",
- "integrity": "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==",
+ "version": "3.19.0",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-3.19.0.tgz",
+ "integrity": "sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==",
"license": "MIT",
"dependencies": {
"@colors/colors": "^1.6.0",
- "@dabh/diagnostics": "^2.0.2",
+ "@dabh/diagnostics": "^2.0.8",
"async": "^3.2.3",
"is-stream": "^2.0.0",
"logform": "^2.7.0",
@@ -5129,9 +5279,9 @@
}
},
"node_modules/wrap-ansi/node_modules/ansi-regex": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
- "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
+ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
"license": "MIT",
"engines": {
"node": ">=12"
@@ -5141,9 +5291,9 @@
}
},
"node_modules/wrap-ansi/node_modules/ansi-styles": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
- "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
+ "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
"license": "MIT",
"engines": {
"node": ">=12"
@@ -5153,12 +5303,12 @@
}
},
"node_modules/wrap-ansi/node_modules/strip-ansi": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
- "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
+ "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
"license": "MIT",
"dependencies": {
- "ansi-regex": "^6.0.1"
+ "ansi-regex": "^6.2.2"
},
"engines": {
"node": ">=12"
diff --git a/package.json b/package.json
index dc9b64af..c75e4219 100644
--- a/package.json
+++ b/package.json
@@ -8,38 +8,40 @@
},
"license": "MIT",
"dependencies": {
- "@swc/core": "1.11.5",
- "async": "3.2.6",
- "builder-amd": "0.0.3",
- "builder-jquery-css": "0.0.4",
- "cross-spawn": "7.0.6",
- "express": "^4.21.2",
+ "@swc/core": "^1.15.18",
+ "async": "^3.2.6",
+ "cross-spawn": "^7.0.6",
+ "express": "^5.2.1",
"fast-glob": "^3.3.3",
- "formidable": "3.5.4",
- "handlebars": "4.7.8",
- "lzma": "2.3.2",
- "node-packager": "0.0.7",
- "semver": "^7.7.1",
- "sqwish": "0.2.2",
- "winston": "^3.17.0",
- "wolfy87-eventemitter": "5.2.9"
+ "formidable": "^3.5.4",
+ "handlebars": "^4.7.8",
+ "lzma": "^2.3.2",
+ "node-packager": "^0.0.7",
+ "requirejs": "^2.3.8",
+ "semver": "^7.7.4",
+ "sqwish": "^0.2.2",
+ "winston": "^3.19.0",
+ "wolfy87-eventemitter": "^5.2.9"
},
"devDependencies": {
- "eslint": "9.21.0",
+ "eslint": "10.0.3",
"eslint-config-jquery": "3.0.2",
- "globals": "^16.0.0",
+ "globals": "17.4.0",
"grunt": "1.6.1",
"grunt-check-modules": "1.1.0",
"grunt-contrib-clean": "2.0.1",
"grunt-contrib-copy": "1.0.0",
"grunt-contrib-handlebars": "3.0.0",
- "grunt-eslint": "25.0.0",
- "pngjs": "^7.0.0",
- "qunit": "^2.24.1"
+ "grunt-eslint": "26.0.0",
+ "pngjs": "7.0.0",
+ "qunit": "2.25.0"
},
"main": "main.js",
"scripts": {
- "test": "qunit --require ./test/setup.js test"
+ "build": "grunt prepare",
+ "lint": "eslint --cache .",
+ "qunit": "qunit --require ./test/setup.js test/*.js",
+ "test": "npm run lint && npm run build && npm run qunit"
},
"engines": {
"node": ">=18"
diff --git a/test/builder-amd-css.js b/test/builder-amd-css.js
new file mode 100644
index 00000000..883be68f
--- /dev/null
+++ b/test/builder-amd-css.js
@@ -0,0 +1,222 @@
+"use strict";
+
+const fs = require( "node:fs" );
+const async = require( "async" );
+const amdCssBuilder = require( "../lib/builder-amd-css" );
+
+QUnit.module( "builder-amd-css" );
+
+const files = {
+ "foo.js": fs.readFileSync( __dirname +
+ "/fixtures/builder-amd-css/basic/foo.js" ),
+ "bar.js": fs.readFileSync( __dirname +
+ "/fixtures/builder-amd-css/basic/bar.js" ),
+ "foo.css": fs.readFileSync( __dirname +
+ "/fixtures/builder-amd-css/basic/foo.css" ),
+ "bar.css": fs.readFileSync( __dirname +
+ "/fixtures/builder-amd-css/basic/bar.css" )
+};
+
+QUnit.test( "CSS dependencies of a JS file", function( assert ) {
+ assert.expect( 1 );
+
+ const done = assert.async();
+
+ amdCssBuilder( files, { include: [ "bar" ] }, function( error, css ) {
+ if ( error ) {
+ assert.ok( false, "amd css builder should not fail" + ( error ?
+ ` with error: ${ error?.message || error }` :
+ ""
+ ) );
+ done();
+ return;
+ }
+
+ assert.strictEqual( css, ".bar {}\n", "includes CSS dependencies" );
+
+ done();
+ } );
+} );
+
+QUnit.test( "CSS dependencies of JS dependencies", function( assert ) {
+ assert.expect( 1 );
+
+ const done = assert.async();
+
+ amdCssBuilder( files, { include: [ "foo" ] }, function( error, css ) {
+ if ( error ) {
+ assert.ok( false, "amd css builder should not fail" + ( error ?
+ ` with error: ${ error?.message || error }` :
+ ""
+ ) );
+ done();
+ return;
+ }
+
+ assert.strictEqual( css, ".foo {}\n.bar {}\n",
+ "includes CSS dependencies of JS dependencies" );
+
+ done();
+ } );
+} );
+
+QUnit.test( "Using appDir", function( assert ) {
+ assert.expect( 1 );
+
+ const done = assert.async();
+
+ const files = {
+ "fixtures/foo.js": fs.readFileSync( __dirname +
+ "/fixtures/builder-amd-css/basic/foo.js" ),
+ "fixtures/bar.js": fs.readFileSync( __dirname +
+ "/fixtures/builder-amd-css/basic/bar.js" ),
+ "fixtures/foo.css": fs.readFileSync( __dirname +
+ "/fixtures/builder-amd-css/basic/foo.css" ),
+ "fixtures/bar.css": fs.readFileSync( __dirname +
+ "/fixtures/builder-amd-css/basic/bar.css" )
+ };
+
+ amdCssBuilder( files, { appDir: "fixtures", include: [ "foo" ] }, function( error, css ) {
+ if ( error ) {
+ assert.ok( false, "amd css builder should not fail" + ( error ?
+ ` with error: ${ error?.message || error }` :
+ ""
+ ) );
+ done();
+ return;
+ }
+
+ assert.strictEqual( css, ".foo {}\n.bar {}\n", "respects appDir" );
+
+ done();
+ } );
+
+} );
+
+QUnit.test( "Using appDir plus CSSes in a sibling subdir", function( assert ) {
+ assert.expect( 1 );
+
+ const done = assert.async();
+
+ const files = {
+ "a/foo.js": fs.readFileSync( __dirname +
+ "/fixtures/builder-amd-css/css-elsewhere/a/foo.js" ),
+ "a/bar.js": fs.readFileSync( __dirname +
+ "/fixtures/builder-amd-css/css-elsewhere/a/bar.js" ),
+ "b/foo.css": fs.readFileSync( __dirname +
+ "/fixtures/builder-amd-css/css-elsewhere/b/foo.css" ),
+ "b/bar.css": fs.readFileSync( __dirname +
+ "/fixtures/builder-amd-css/css-elsewhere/b/bar.css" )
+ };
+
+ amdCssBuilder( files, { appDir: "a", include: [ "foo" ] }, function( error, css ) {
+ if ( error ) {
+ assert.ok( false, "amd css builder should not fail" + ( error ?
+ ` with error: ${ error?.message || error }` :
+ ""
+ ) );
+ done();
+ return;
+ }
+
+ assert.strictEqual( css, ".foo {}\n.bar {}\n",
+ "resolves CSSes from a sibling subdir" );
+
+ done();
+ } );
+
+} );
+
+QUnit.test( "Serial runs", function( assert ) {
+ assert.expect( 2 );
+
+ const done = assert.async();
+
+ async.series( [
+ function( callback ) {
+ amdCssBuilder( files, { include: [ "bar" ] }, callback );
+ },
+ function( callback ) {
+ amdCssBuilder( files, { include: [ "foo" ] }, callback );
+ }
+ ], function( error, result ) {
+ if ( error ) {
+ assert.ok( false, "amd css builder should not fail" + ( error ?
+ ` with error: ${ error?.message || error }` :
+ ""
+ ) );
+ done();
+ return;
+ }
+
+ const barCss = result[ 0 ][ 0 ];
+ const fooCss = result[ 1 ][ 0 ];
+
+ assert.strictEqual( barCss, ".bar {}\n", "first run works fine" );
+ assert.strictEqual( fooCss, ".foo {}\n.bar {}\n", "second run works fine" );
+
+ done();
+ } );
+} );
+
+QUnit.test( "Concurrent runs", function( assert ) {
+ assert.expect( 2 );
+
+ const done = assert.async();
+
+ async.parallel( [
+ function( callback ) {
+ amdCssBuilder( files, { include: [ "bar" ] }, callback );
+ },
+ function( callback ) {
+ amdCssBuilder( files, { include: [ "foo" ] }, callback );
+ }
+ ], function( error, result ) {
+ if ( error ) {
+ assert.ok( false, "amd css builder should not fail" + ( error ?
+ ` with error: ${ error?.message || error }` :
+ ""
+ ) );
+ done();
+ return;
+ }
+
+ const barCss = result[ 0 ][ 0 ];
+ const fooCss = result[ 1 ][ 0 ];
+
+ assert.strictEqual( barCss, ".bar {}\n", "first run works fine" );
+ assert.strictEqual( fooCss, ".foo {}\n.bar {}\n", "second run works fine" );
+
+ done();
+ } );
+} );
+
+QUnit.test( "onCssBuildWrite property", function( assert ) {
+ assert.expect( 1 );
+
+ const done = assert.async();
+
+ amdCssBuilder( files, {
+ include: [ "foo" ],
+ onCssBuildWrite: function( path, data ) {
+ if ( /bar/.test( path ) ) {
+ data = data.replace( /bar/, "baz" ).replace( /foo/, "qux" );
+ }
+ return data;
+ }
+ }, function( error, css ) {
+ if ( error ) {
+ assert.ok( false, "amd css builder should not fail" + ( error ?
+ ` with error: ${ error?.message || error }` :
+ ""
+ ) );
+ done();
+ return;
+ }
+
+ assert.strictEqual( css, ".foo {}\n.baz {}\n",
+ "rewrites CSS content via onCssBuildWrite, analogous to onBuildWrite for JS" );
+
+ done();
+ } );
+} );
diff --git a/test/builder-amd.js b/test/builder-amd.js
new file mode 100644
index 00000000..99384920
--- /dev/null
+++ b/test/builder-amd.js
@@ -0,0 +1,206 @@
+"use strict";
+
+QUnit.module( "builder-amd" );
+
+const fs = require( "node:fs" );
+const async = require( "async" );
+const amdBuilder = require( "../lib/builder-amd" );
+
+const files = {
+ "foo.js": fs.readFileSync( __dirname + "/fixtures/builder-amd/basic/foo.js" ),
+ "bar.js": fs.readFileSync( __dirname + "/fixtures/builder-amd/basic/bar.js" )
+};
+
+QUnit.test( "The JS file of the include property", function( assert ) {
+ assert.expect( 1 );
+
+ const done = assert.async();
+
+ amdBuilder( files, { include: [ "bar" ] }, function( error, js ) {
+ if ( error ) {
+ assert.ok( false, "amd builder should not fail" + ( error ?
+ ` with error: ${ error?.message || error }` :
+ ""
+ ) );
+ done();
+ return;
+ }
+
+ assert.strictEqual(
+ js,
+ "define(\"bar\",[],function(){}),define(\"output\",function(){});",
+ "includes the JS file from the include property"
+ );
+
+ done();
+ } );
+} );
+
+QUnit.test( "The JS dependencies", function( assert ) {
+ assert.expect( 1 );
+
+ const done = assert.async();
+
+ amdBuilder( files, { include: [ "foo" ] }, function( error, js ) {
+ if ( error ) {
+ assert.ok( false, "amd builder should not fail" + ( error ?
+ ` with error: ${ error?.message || error }` :
+ ""
+ ) );
+ done();
+ return;
+ }
+
+ assert.strictEqual(
+ js,
+ "define(\"bar\",[],function(){}),define([\"./bar\"]),define(\"output\",function(){});",
+ "includes dependencies"
+ );
+
+ done();
+ } );
+} );
+
+QUnit.test( "Using appDir", function( assert ) {
+ assert.expect( 1 );
+
+ const done = assert.async();
+
+ const nestedFiles = {
+ "fixtures/foo.js": fs.readFileSync( __dirname +
+ "/fixtures/builder-amd/basic/foo.js" ),
+ "fixtures/bar.js": fs.readFileSync( __dirname +
+ "/fixtures/builder-amd/basic/bar.js" )
+ };
+
+ amdBuilder( nestedFiles, { appDir: "fixtures", include: [ "foo" ] }, function( error, js ) {
+ if ( error ) {
+ assert.ok( false, "amd builder should not fail" + ( error ?
+ ` with error: ${ error?.message || error }` :
+ ""
+ ) );
+ done();
+ return;
+ }
+
+ assert.strictEqual(
+ js,
+ "define(\"bar\",[],function(){}),define([\"./bar\"]),define(\"output\",function(){});",
+ "respects appDir"
+ );
+
+ done();
+ } );
+
+} );
+
+QUnit.test( "Serial runs", function( assert ) {
+ assert.expect( 2 );
+
+ const done = assert.async();
+
+ async.series( [
+ function( callback ) {
+ amdBuilder( files, { include: [ "bar" ] }, callback );
+ },
+ function( callback ) {
+ amdBuilder( files, { include: [ "foo" ] }, callback );
+ }
+ ], function( error, result ) {
+ if ( error ) {
+ assert.ok( false, "amd builder should not fail" + ( error ?
+ ` with error: ${ error?.message || error }` :
+ ""
+ ) );
+ done();
+ return;
+ }
+
+ const barJs = result[ 0 ][ 0 ];
+ const fooJs = result[ 1 ][ 0 ];
+
+ assert.strictEqual(
+ barJs,
+ "define(\"bar\",[],function(){}),define(\"output\",function(){});",
+ "first run works fine"
+ );
+ assert.strictEqual(
+ fooJs,
+ "define(\"bar\",[],function(){}),define([\"./bar\"]),define(\"output\",function(){});",
+ "second run works fine"
+ );
+
+ done();
+ } );
+} );
+
+QUnit.test( "Concurrent runs", function( assert ) {
+ assert.expect( 2 );
+
+ const done = assert.async();
+
+ async.parallel( [
+ function( callback ) {
+ amdBuilder( files, { include: [ "bar" ] }, callback );
+ },
+ function( callback ) {
+ amdBuilder( files, { include: [ "foo" ] }, callback );
+ }
+ ], function( error, result ) {
+ if ( error ) {
+ assert.ok( false, "amd builder should not fail" + ( error ?
+ ` with error: ${ error?.message || error }` :
+ ""
+ ) );
+ done();
+ return;
+ }
+
+ const barJs = result[ 0 ][ 0 ];
+ const fooJs = result[ 1 ][ 0 ];
+
+ assert.strictEqual(
+ barJs,
+ "define(\"bar\",[],function(){}),define(\"output\",function(){});",
+ "first run works fine"
+ );
+ assert.strictEqual(
+ fooJs,
+ "define(\"bar\",[],function(){}),define([\"./bar\"]),define(\"output\",function(){});",
+ "second run works fine"
+ );
+
+ done();
+ } );
+} );
+
+QUnit.test( "onBuildWrite property", function( assert ) {
+ assert.expect( 1 );
+
+ const done = assert.async();
+
+ amdBuilder( files, {
+ include: [ "foo" ],
+ optimize: "none",
+ onBuildWrite: function( id, path, contents ) {
+ return "/* banner for " + id + " */\n" + contents;
+ }
+ }, function( error, result ) {
+ if ( error ) {
+ assert.ok( false, "amd builder should not fail" + ( error ?
+ ` with error: ${ error?.message || error }` :
+ ""
+ ) );
+ done();
+ return;
+ }
+
+ assert.strictEqual(
+ result,
+ "/* banner for bar */\ndefine('bar',[],function() {});\n\n/* banner for foo */\ndefine([ \"./bar\" ]);\n\n\ndefine(\"output\", function(){});\n",
+ "onBuildWrite is applied"
+ );
+ done();
+ } );
+} );
+
diff --git a/test/builder-jquery-css.js b/test/builder-jquery-css.js
new file mode 100644
index 00000000..9163e30a
--- /dev/null
+++ b/test/builder-jquery-css.js
@@ -0,0 +1,171 @@
+"use strict";
+
+const fs = require( "node:fs" );
+const async = require( "async" );
+const jQueryCSSBuilder = require( "../lib/builder-jquery-css" );
+
+QUnit.module( "builder-jquery-css" );
+
+const files = {
+ "foo.js": fs.readFileSync( __dirname + "/fixtures/builder-jquery-css/basic/foo.js" ),
+ "bar.js": fs.readFileSync( __dirname + "/fixtures/builder-jquery-css/basic/bar.js" ),
+ "foo.css": fs.readFileSync( __dirname + "/fixtures/builder-jquery-css/basic/foo.css" ),
+ "bar.css": fs.readFileSync( __dirname + "/fixtures/builder-jquery-css/basic/bar.css" )
+};
+
+QUnit.test( "Basic", function( assert ) {
+ assert.expect( 1 );
+
+ const done = assert.async();
+
+ jQueryCSSBuilder( files, "baz", { include: [ "foo" ] }, function( error, css ) {
+ if ( error ) {
+ assert.ok( false, "css builder should not fail" + ( error ?
+ ` with error: ${ error?.message || error }` :
+ ""
+ ) );
+ done();
+ return;
+ }
+
+ assert.strictEqual( css, ".foo {}\n.bar {}\n", "basic functionality works" );
+
+ done();
+ } );
+} );
+
+QUnit.test( "Basic - using appDir", function( assert ) {
+ assert.expect( 1 );
+
+ const done = assert.async();
+
+ const files = {
+ "fixtures/foo.js": fs.readFileSync( __dirname +
+ "/fixtures/builder-jquery-css/basic/foo.js" ),
+ "fixtures/bar.js": fs.readFileSync( __dirname +
+ "/fixtures/builder-jquery-css/basic/bar.js" ),
+ "fixtures/foo.css": fs.readFileSync( __dirname +
+ "/fixtures/builder-jquery-css/basic/foo.css" ),
+ "fixtures/bar.css": fs.readFileSync( __dirname +
+ "/fixtures/builder-jquery-css/basic/bar.css" )
+ };
+
+ jQueryCSSBuilder( files, "baz", { appDir: "fixtures", include: [ "foo" ] }, function( error, css ) {
+ if ( error ) {
+ assert.ok( false, "css builder should not fail" + ( error ?
+ ` with error: ${ error?.message || error }` :
+ ""
+ ) );
+ done();
+ return;
+ }
+
+ assert.strictEqual( css, ".foo {}\n.bar {}\n", "basic functionality works with appDir" );
+
+ done();
+ } );
+
+} );
+
+QUnit.test( "Basic - nested+appdir", function( assert ) {
+ assert.expect( 1 );
+
+ const done = assert.async();
+
+ const files = {
+ "fixtures/version.js": fs.readFileSync( __dirname +
+ "/fixtures/builder-jquery-css/nested/version.js" ),
+ "fixtures/widgets/input.js": fs.readFileSync( __dirname +
+ "/fixtures/builder-jquery-css/nested/widgets/input.js" ),
+ "fixtures/theme/version.css": fs.readFileSync( __dirname +
+ "/fixtures/builder-jquery-css/nested/theme/version.css" ),
+ "fixtures/theme/input.css": fs.readFileSync( __dirname +
+ "/fixtures/builder-jquery-css/nested/theme/input.css" )
+ };
+
+ jQueryCSSBuilder( files, "structure", { appDir: "fixtures", include: [ "widgets/input" ] }, function( error, css ) {
+ if ( error ) {
+ assert.ok( false, "css builder should not fail" + ( error ?
+ ` with error: ${ error?.message || error }` :
+ ""
+ ) );
+ done();
+ return;
+ }
+
+ assert.strictEqual( css, "input {}\nbody {}\n", "nested+appdir functionality works" );
+
+ done();
+ } );
+
+} );
+
+QUnit.test( "Two bundles", function( assert ) {
+ assert.expect( 2 );
+
+ const done = assert.async();
+
+ const files = {
+ "foo.js": fs.readFileSync( __dirname +
+ "/fixtures/builder-jquery-css/two-bundles/foo.js" ),
+ "bar.js": fs.readFileSync( __dirname +
+ "/fixtures/builder-jquery-css/two-bundles/bar.js" ),
+ "baz.js": fs.readFileSync( __dirname +
+ "/fixtures/builder-jquery-css/two-bundles/baz.js" ),
+ "foo.css": fs.readFileSync( __dirname +
+ "/fixtures/builder-jquery-css/two-bundles/foo.css" ),
+ "bar.css": fs.readFileSync( __dirname +
+ "/fixtures/builder-jquery-css/two-bundles/bar.css" ),
+ "baz.css": fs.readFileSync( __dirname +
+ "/fixtures/builder-jquery-css/two-bundles/baz.css" )
+ };
+
+ async.series( [
+ function( callback ) {
+ jQueryCSSBuilder( files, "north", { include: [ "foo" ] }, callback );
+ },
+ function( callback ) {
+ jQueryCSSBuilder( files, "south", { include: [ "foo" ] }, callback );
+ }
+ ], function( error, result ) {
+ if ( error ) {
+ assert.ok( false, "css builder should not fail" + ( error ?
+ ` with error: ${ error?.message || error }` :
+ ""
+ ) );
+ done();
+ return;
+ }
+
+ const northCss = result[ 0 ][ 0 ];
+ const southCss = result[ 1 ][ 0 ];
+
+ assert.strictEqual( northCss, ".bar {}\n.baz {}\n", "north bundle builds correctly" );
+ assert.strictEqual( southCss, ".foo {}\n", "south bundle builds correctly" );
+
+ done();
+ } );
+
+} );
+
+QUnit.test( "Empty bundle", function( assert ) {
+ assert.expect( 1 );
+
+ const done = assert.async();
+
+ jQueryCSSBuilder( files, "nonexistent", { include: [ "foo" ] }, function( error, result ) {
+ if ( error ) {
+ assert.ok( false, "css builder should not fail" + ( error ?
+ ` with error: ${ error?.message || error }` :
+ ""
+ ) );
+ done();
+ return;
+ }
+
+ assert.strictEqual( result, "", "empty bundle builds just fine" );
+
+ done();
+ } );
+
+} );
diff --git a/test/fixtures/builder-amd-css/basic/bar.css b/test/fixtures/builder-amd-css/basic/bar.css
new file mode 100644
index 00000000..b9b5afc8
--- /dev/null
+++ b/test/fixtures/builder-amd-css/basic/bar.css
@@ -0,0 +1 @@
+.bar {}
diff --git a/test/fixtures/builder-amd-css/basic/bar.js b/test/fixtures/builder-amd-css/basic/bar.js
new file mode 100644
index 00000000..c783c1b4
--- /dev/null
+++ b/test/fixtures/builder-amd-css/basic/bar.js
@@ -0,0 +1 @@
+define([ "css!./bar.css" ]);
diff --git a/test/fixtures/builder-amd-css/basic/foo.css b/test/fixtures/builder-amd-css/basic/foo.css
new file mode 100644
index 00000000..33afbeb5
--- /dev/null
+++ b/test/fixtures/builder-amd-css/basic/foo.css
@@ -0,0 +1 @@
+.foo {}
diff --git a/test/fixtures/builder-amd-css/basic/foo.js b/test/fixtures/builder-amd-css/basic/foo.js
new file mode 100644
index 00000000..5ae467bb
--- /dev/null
+++ b/test/fixtures/builder-amd-css/basic/foo.js
@@ -0,0 +1 @@
+define([ "css!./foo.css", "./bar" ]);
diff --git a/test/fixtures/builder-amd-css/css-elsewhere/a/bar.js b/test/fixtures/builder-amd-css/css-elsewhere/a/bar.js
new file mode 100644
index 00000000..d4882d7c
--- /dev/null
+++ b/test/fixtures/builder-amd-css/css-elsewhere/a/bar.js
@@ -0,0 +1 @@
+define([ "css!../b/bar.css" ]);
diff --git a/test/fixtures/builder-amd-css/css-elsewhere/a/foo.js b/test/fixtures/builder-amd-css/css-elsewhere/a/foo.js
new file mode 100644
index 00000000..e763cc06
--- /dev/null
+++ b/test/fixtures/builder-amd-css/css-elsewhere/a/foo.js
@@ -0,0 +1 @@
+define([ "css!../b/foo.css", "./bar" ]);
diff --git a/test/fixtures/builder-amd-css/css-elsewhere/b/bar.css b/test/fixtures/builder-amd-css/css-elsewhere/b/bar.css
new file mode 100644
index 00000000..b9b5afc8
--- /dev/null
+++ b/test/fixtures/builder-amd-css/css-elsewhere/b/bar.css
@@ -0,0 +1 @@
+.bar {}
diff --git a/test/fixtures/builder-amd-css/css-elsewhere/b/foo.css b/test/fixtures/builder-amd-css/css-elsewhere/b/foo.css
new file mode 100644
index 00000000..33afbeb5
--- /dev/null
+++ b/test/fixtures/builder-amd-css/css-elsewhere/b/foo.css
@@ -0,0 +1 @@
+.foo {}
diff --git a/test/fixtures/builder-amd/basic/bar.js b/test/fixtures/builder-amd/basic/bar.js
new file mode 100644
index 00000000..a6eaf777
--- /dev/null
+++ b/test/fixtures/builder-amd/basic/bar.js
@@ -0,0 +1 @@
+define(function() {});
diff --git a/test/fixtures/builder-amd/basic/foo.js b/test/fixtures/builder-amd/basic/foo.js
new file mode 100644
index 00000000..4d0759bc
--- /dev/null
+++ b/test/fixtures/builder-amd/basic/foo.js
@@ -0,0 +1 @@
+define([ "./bar" ]);
diff --git a/test/fixtures/builder-jquery-css/basic/bar.css b/test/fixtures/builder-jquery-css/basic/bar.css
new file mode 100644
index 00000000..b9b5afc8
--- /dev/null
+++ b/test/fixtures/builder-jquery-css/basic/bar.css
@@ -0,0 +1 @@
+.bar {}
diff --git a/test/fixtures/builder-jquery-css/basic/bar.js b/test/fixtures/builder-jquery-css/basic/bar.js
new file mode 100644
index 00000000..b5a2f6ab
--- /dev/null
+++ b/test/fixtures/builder-jquery-css/basic/bar.js
@@ -0,0 +1,2 @@
+//>> css.baz: ./bar.css
+define(function() {});
diff --git a/test/fixtures/builder-jquery-css/basic/foo.css b/test/fixtures/builder-jquery-css/basic/foo.css
new file mode 100644
index 00000000..33afbeb5
--- /dev/null
+++ b/test/fixtures/builder-jquery-css/basic/foo.css
@@ -0,0 +1 @@
+.foo {}
diff --git a/test/fixtures/builder-jquery-css/basic/foo.js b/test/fixtures/builder-jquery-css/basic/foo.js
new file mode 100644
index 00000000..7052c3c1
--- /dev/null
+++ b/test/fixtures/builder-jquery-css/basic/foo.js
@@ -0,0 +1,6 @@
+//>> css.baz: ./foo.css
+define([
+
+ // comment
+ "./bar"
+]);
diff --git a/test/fixtures/builder-jquery-css/nested/theme/input.css b/test/fixtures/builder-jquery-css/nested/theme/input.css
new file mode 100644
index 00000000..c4236fe2
--- /dev/null
+++ b/test/fixtures/builder-jquery-css/nested/theme/input.css
@@ -0,0 +1 @@
+input {}
diff --git a/test/fixtures/builder-jquery-css/nested/theme/version.css b/test/fixtures/builder-jquery-css/nested/theme/version.css
new file mode 100644
index 00000000..208d16d4
--- /dev/null
+++ b/test/fixtures/builder-jquery-css/nested/theme/version.css
@@ -0,0 +1 @@
+body {}
diff --git a/test/fixtures/builder-jquery-css/nested/version.js b/test/fixtures/builder-jquery-css/nested/version.js
new file mode 100644
index 00000000..3af12211
--- /dev/null
+++ b/test/fixtures/builder-jquery-css/nested/version.js
@@ -0,0 +1,2 @@
+//>> css.structure: ./theme/version.css
+define( "0.2.0" );
diff --git a/test/fixtures/builder-jquery-css/nested/widgets/input.js b/test/fixtures/builder-jquery-css/nested/widgets/input.js
new file mode 100644
index 00000000..d3ca601d
--- /dev/null
+++ b/test/fixtures/builder-jquery-css/nested/widgets/input.js
@@ -0,0 +1,3 @@
+//>> css.structure: ../theme/input.css
+define( ["../version"], function( version ) {
+} );
diff --git a/test/fixtures/builder-jquery-css/two-bundles/bar.css b/test/fixtures/builder-jquery-css/two-bundles/bar.css
new file mode 100644
index 00000000..b9b5afc8
--- /dev/null
+++ b/test/fixtures/builder-jquery-css/two-bundles/bar.css
@@ -0,0 +1 @@
+.bar {}
diff --git a/test/fixtures/builder-jquery-css/two-bundles/bar.js b/test/fixtures/builder-jquery-css/two-bundles/bar.js
new file mode 100644
index 00000000..4f66b690
--- /dev/null
+++ b/test/fixtures/builder-jquery-css/two-bundles/bar.js
@@ -0,0 +1,2 @@
+//>> css.north: ./bar.css
+define([ "./baz" ]);
diff --git a/test/fixtures/builder-jquery-css/two-bundles/baz.css b/test/fixtures/builder-jquery-css/two-bundles/baz.css
new file mode 100644
index 00000000..823976c0
--- /dev/null
+++ b/test/fixtures/builder-jquery-css/two-bundles/baz.css
@@ -0,0 +1 @@
+.baz {}
diff --git a/test/fixtures/builder-jquery-css/two-bundles/baz.js b/test/fixtures/builder-jquery-css/two-bundles/baz.js
new file mode 100644
index 00000000..f0660f69
--- /dev/null
+++ b/test/fixtures/builder-jquery-css/two-bundles/baz.js
@@ -0,0 +1,2 @@
+//>> css.north: ./baz.css
+define(function() {});
diff --git a/test/fixtures/builder-jquery-css/two-bundles/foo.css b/test/fixtures/builder-jquery-css/two-bundles/foo.css
new file mode 100644
index 00000000..33afbeb5
--- /dev/null
+++ b/test/fixtures/builder-jquery-css/two-bundles/foo.css
@@ -0,0 +1 @@
+.foo {}
diff --git a/test/fixtures/builder-jquery-css/two-bundles/foo.js b/test/fixtures/builder-jquery-css/two-bundles/foo.js
new file mode 100644
index 00000000..de32096e
--- /dev/null
+++ b/test/fixtures/builder-jquery-css/two-bundles/foo.js
@@ -0,0 +1,2 @@
+//>> css.south: ./foo.css
+define([ "./bar" ]);
diff --git a/test/requirejs-memfiles.js b/test/requirejs-memfiles.js
new file mode 100644
index 00000000..043e7311
--- /dev/null
+++ b/test/requirejs-memfiles.js
@@ -0,0 +1,141 @@
+"use strict";
+
+const async = require( "async" );
+const requirejs = require( "../lib/requirejs-memfiles" );
+
+QUnit.module( "requirejs-memfiles" );
+
+QUnit.test( "requirejs.optimize", function( assert ) {
+ assert.expect( 2 );
+
+ const done = assert.async();
+
+ const files = {
+ "a.js": "define([\"./b\"], function( b ) { return b; });",
+ "b.js": "define(function() { return \"B\"; });"
+ };
+
+ requirejs.setFiles( files, function( doneRequirejsMemfiles ) {
+ requirejs.optimize( {
+ appDir: ".",
+ baseUrl: ".",
+ dir: "dist",
+ modules: [ {
+ name: "output",
+ include: "a",
+ create: true
+ } ]
+ }, function() {
+ assert.ok( "dist/output.js" in files,
+ "dist/output.js is in files" );
+ assert.strictEqual(
+ files[ "dist/output.js" ],
+ "define(\"b\",[],function(){return\"B\"}),define(\"a\",[\"./b\"]," +
+ "function(n){return n}),define(\"output\",function(){});",
+ "dist/output.js has expected content"
+ );
+
+ done();
+ doneRequirejsMemfiles();
+ }, function( error ) {
+ assert.ok( false, "requirejs.optimize should not fail" + ( error ?
+ ` with error: ${ error?.message || error }` :
+ ""
+ ) );
+ done();
+ doneRequirejsMemfiles();
+ } );
+ } );
+} );
+
+QUnit.test( "concurrent requirejs.optimize calls", function( assert ) {
+ assert.expect( 6 );
+
+ const done = assert.async();
+
+ const filesA = {
+ "a.js": "define([\"./b\"], function( b ) { return b; });",
+ "b.js": "define(function() { return \"B\"; });"
+ };
+ const filesB = {
+ "a.js": "define([\"./b\"], function( b ) { return b; });",
+ "b.js": "define(function() { return \"B\"; });"
+ };
+
+ async.parallel( [
+ function( callback ) {
+ requirejs.setFiles( filesA, function( doneRequirejsMemfiles ) {
+ requirejs.optimize( {
+ appDir: ".",
+ baseUrl: ".",
+ dir: "dist",
+ modules: [ {
+ name: "outputA",
+ include: "a",
+ create: true
+ } ]
+ }, function() {
+ callback();
+ doneRequirejsMemfiles();
+ }, function( error ) {
+ callback( error );
+ doneRequirejsMemfiles();
+ } );
+ } );
+ },
+ function( callback ) {
+ requirejs.setFiles( filesB, function( doneRequirejsMemfiles ) {
+ requirejs.optimize( {
+ appDir: ".",
+ baseUrl: ".",
+ dir: "dist",
+ modules: [ {
+ name: "outputB",
+ include: "a",
+ create: true
+ } ]
+ }, function() {
+ callback();
+ doneRequirejsMemfiles();
+ }, function( error ) {
+ callback( error );
+ doneRequirejsMemfiles();
+ } );
+ } );
+ }
+ ], function( error ) {
+ if ( error ) {
+ assert.ok( false, "requirejs.optimize should not fail" + ( error ?
+ ` with error: ${ error?.message || error }` :
+ ""
+ ) );
+ done();
+ return;
+ }
+
+ assert.ok( "dist/outputA.js" in filesA,
+ "dist/outputA.js is in filesA" );
+ assert.notOk( "dist/outputB.js" in filesA,
+ "dist/outputB.js is not in filesA" );
+ assert.strictEqual(
+ filesA[ "dist/outputA.js" ],
+ "define(\"b\",[],function(){return\"B\"}),define(\"a\",[\"./b\"]," +
+ "function(n){return n}),define(\"outputA\",function(){});",
+ "dist/outputA.js has expected content"
+ );
+
+ assert.ok( "dist/outputB.js" in filesB,
+ "dist/outputB.js is in filesB" );
+ assert.notOk( "dist/outputA.js" in filesB,
+ "dist/outputA.js is not in filesB" );
+ assert.strictEqual(
+ filesB[ "dist/outputB.js" ],
+ "define(\"b\",[],function(){return\"B\"}),define(\"a\",[\"./b\"]," +
+ "function(n){return n}),define(\"outputB\",function(){});",
+ "dist/outputB.js has expected content"
+ );
+
+ done();
+ } );
+
+} );