diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..fd22078f --- /dev/null +++ b/.dockerignore @@ -0,0 +1,6 @@ +.git +app/dist +jquery-ui +log/downloads.log +node_modules +tmp diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..2740db33 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,15 @@ +# This file is for unifying the coding style for different editors and IDEs +# editorconfig.org + +root = true + +[*] +indent_style = tab +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.yml] +indent_style = space +indent_size = 2 diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..aa2f7456 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,13 @@ +version: 2 +updates: + - package-ecosystem: github-actions + directory: "/" + schedule: + interval: monthly + + # Group all dependabot version update PRs into one + groups: + github-actions: + applies-to: version-updates + patterns: + - "*" diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml new file mode 100644 index 00000000..ba8fb0e1 --- /dev/null +++ b/.github/workflows/node.js.yml @@ -0,0 +1,73 @@ +name: CI + +on: + pull_request: + push: + branches-ignore: "dependabot/**" + +jobs: + build: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + # Node.js 18 is required by jqueryui.com + # Remember to include the version used in Dockerfile! + NODE_VERSION: [18.x, 20.x, 22.x] + steps: + - name: Checkout + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Update apt-get cache + run: sudo apt-get update + + - name: Install xsltproc + run: sudo apt-get install -y xsltproc + + # When Ubuntu Plucky is available in GitHub Actions, switch to it, remove + # the following section and just install the `imagemagick` package normally + # via apt-get. + - name: Download and build ImageMagick 7 + run: | + sudo apt-get install -y build-essential pkg-config \ + libjpeg-dev libpng-dev libtiff-dev libwebp-dev + + # Replace the version below with the desired release + IM_VERSION="7.1.1-44" + wget https://download.imagemagick.org/ImageMagick/download/releases/ImageMagick-${IM_VERSION}.tar.xz + tar -xf ImageMagick-${IM_VERSION}.tar.xz + cd ImageMagick-${IM_VERSION} + + ./configure + make -j$(nproc) + sudo make install + sudo ldconfig + + - name: Use Node.js ${{ matrix.NODE_VERSION }} + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + with: + node-version: ${{ matrix.NODE_VERSION }} + + - name: Cache + uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 + with: + path: ~/.npm + key: ${{ runner.os }}-node-${{ matrix.NODE_VERSION }}-npm-lock-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-node-${{ matrix.NODE_VERSION }}-npm-lock- + ${{ runner.os }}-node-${{ matrix.NODE_VERSION }}- + ${{ runner.os }}-node- + ${{ runner.os }}- + + + - name: Install dependencies + run: | + npm ci + + - name: Prepare for tests + run: | + ./node_modules/.bin/grunt prepare + + - name: Run tests + run: | + npm test diff --git a/.gitignore b/.gitignore index a7a2bfe4..14adf260 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,4 @@ -app/resources/download.all.min.js -app/resources/themeroller.all.min.js -app/src/template +app/dist jquery-ui log/downloads.log node_modules diff --git a/.npmignore b/.npmignore new file mode 100644 index 00000000..f71f9823 --- /dev/null +++ b/.npmignore @@ -0,0 +1,7 @@ +.idea +.vscode +app/dist +jquery-ui +log/downloads.log +node_modules +tmp diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000..2bd5a0a9 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +22 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index cc02edc9..e3b17c4a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,5 +1,5 @@ -Welcome! Thanks for your interest in contributing to download.jqueryui.com. You're **almost** in the right place. More information on how to contribute to this and all other jQuery Foundation projects is over at [contribute.jquery.org](http://contribute.jquery.org). You'll definitely want to take a look at the articles on contributing [to our websites](http://contribute.jquery.org/web-sites/). +Welcome! Thanks for your interest in contributing to download.jqueryui.com. You're **almost** in the right place. More information on how to contribute to this and all other jQuery projects is over at [contribute.jquery.org](https://contribute.jquery.org). You'll definitely want to take a look at the articles on contributing [to our websites](https://contribute.jquery.org/web-sites/). -You may also want to take a look at our [commit & pull request guide](http://contribute.jquery.org/commits-and-pull-requests/) and [style guides](http://contribute.jquery.org/style-guide/) for instructions on how to maintain your fork and submit your code. Before we can merge any pull request, we'll also need you to sign our [contributor license agreement](http://contribute.jquery.org/cla). +You may also want to take a look at our [commit & pull request guide](https://contribute.jquery.org/commits-and-pull-requests/) and [style guides](https://contribute.jquery.org/style-guide/) for instructions on how to maintain your fork and submit your code. Before we can merge any pull request, we'll also need you to sign our [contributor license agreement](https://contribute.jquery.org/cla). -You can find us on [IRC](http://irc.jquery.org), specifically in #jqueryui-dev should you have any questions. If you've never contributed to open source before, we've put together [a short guide with tips, tricks, and ideas on getting started](http://contribute.jquery.org/open-source/). +You can find us on [IRC](https://irc.jquery.org), specifically in #jqueryui-dev should you have any questions. If you've never contributed to open source before, we've put together [a short guide with tips, tricks, and ideas on getting started](https://contribute.jquery.org/open-source/). diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..d03d20aa --- /dev/null +++ b/Dockerfile @@ -0,0 +1,16 @@ +FROM node:22-alpine + +WORKDIR /app +COPY package*.json ./ + +RUN apk add libxml2 libxslt git imagemagick python3 make g++ +RUN npm install + +COPY . . + +RUN npx grunt prepare + +EXPOSE 8080 + +CMD ["node", "server.js"] + diff --git a/Gruntfile.js b/Gruntfile.js index 601fbe58..e664603e 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -1,75 +1,99 @@ +"use strict"; + var async = require( "async" ), - fs = require( "fs" ), - path = require( "path" ); + fs = require( "node:fs" ), + fsp = require( "node:fs/promises" ), + path = require( "node:path" ); module.exports = function( grunt ) { -"use strict"; grunt.loadNpmTasks( "grunt-check-modules" ); +grunt.loadNpmTasks( "grunt-contrib-clean" ); +grunt.loadNpmTasks( "grunt-contrib-copy" ); grunt.loadNpmTasks( "grunt-contrib-handlebars" ); -grunt.loadNpmTasks( "grunt-contrib-jshint" ); -grunt.loadNpmTasks( "grunt-contrib-uglify" ); +grunt.loadNpmTasks( "grunt-eslint" ); -grunt.initConfig({ +grunt.initConfig( { pkg: grunt.file.readJSON( "package.json" ), handlebars: { options: { + // Use basename as the key for the precompiled object. processName: function( filepath ) { return path.basename( filepath ); }, + // Wrap preprocessed template functions in Handlebars.template function. wrapped: true }, compile: { files: { - "app/src/template/download.js": [ "template/download/components.html", "template/download/service_status.html", "template/download/theme.html" ], - "app/src/template/themeroller.js": [ "template/themeroller/rollyourown.html", "template/themeroller/_rollyourown_group_corner.html", "template/themeroller/_rollyourown_group_default.html", "template/themeroller/_rollyourown_group_dropshadow.html", "template/themeroller/_rollyourown_group_font.html", "template/themeroller/_rollyourown_group_modaloverlay.html" ] + "tmp/app/template/download.js": [ "template/download/components.html", "template/download/service_status.html", "template/download/theme.html" ], + "tmp/app/template/themeroller.js": [ "template/themeroller/rollyourown.html", "template/themeroller/_rollyourown_group_corner.html", "template/themeroller/_rollyourown_group_default.html", "template/themeroller/_rollyourown_group_dropshadow.html", "template/themeroller/_rollyourown_group_font.html", "template/themeroller/_rollyourown_group_modaloverlay.html" ] } } }, - jshint: { - all: [ "*.js", "test/*js", "lib/**/*.js", "app/src/*.js" ], - options: { - boss: true, - curly: true, - eqeqeq: true, - eqnull: true, - immed: true, - latedef: true, - noarg: true, - node: true, - onevar: true, - proto: true, - smarttabs: true, - strict: false, - sub: true, - trailing: true, - undef: true - } + eslint: { + all: [ "*.js", "test/*js", "lib/**/*.js", "app/src/*.js" ] }, - uglify: { - options: { - preserveComments: "some" + copy: { + appExternalFarbtastic: { + src: "external/farbtastic/farbtastic.css", + dest: "app/dist/external/farbtastic.css" + }, + appImages: { + expand: true, + cwd: "app/src", + src: [ "images/**/*" ], + dest: "app/dist" }, + appImagesExternalFarbtastic: { + expand: true, + cwd: "external/farbtastic", + src: [ "marker.png", "mask.png", "wheel.png" ], + dest: "app/dist/images/farbtastic" + }, + appStyles: { + expand: true, + cwd: "app/src", + src: [ "download.css", "themeroller.css" ], + dest: "app/dist" + } + }, + minify: { + // DownloadBuilder minified frontend bundle download: { - src: [ "app/src/external/event_emitter.min.js", "app/src/external/handlebars.runtime.js", "app/src/template/download.js", "app/src/external/lzma.js", "app/src/hash.js", "app/src/querystring.js", "app/src/model.js", "app/src/download.js" ], - dest: "app/resources/download.all.min.js" + src: [ "node_modules/wolfy87-eventemitter/EventEmitter.js", "node_modules/handlebars/dist/handlebars.runtime.js", "tmp/app/template/download.js", "node_modules/lzma/src/lzma.js", "app/src/hash.js", "app/src/querystring.js", "app/src/model.js", "app/src/download.js" ], + dest: "app/dist/download.all.min.js" }, + // ThemeRoller minified frontend bundle themeroller: { - src: [ "app/src/external/event_emitter.min.js", "app/src/external/handlebars.runtime.js", "app/src/template/themeroller.js", "app/src/external/farbtastic.js", "app/src/external/lzma.js", "app/src/hash.js", "app/src/querystring.js", "app/src/model.js", "app/src/themeroller.js" ], - dest: "app/resources/themeroller.all.min.js" + src: [ "node_modules/wolfy87-eventemitter/EventEmitter.js", "node_modules/handlebars/dist/handlebars.runtime.js", "tmp/app/template/themeroller.js", "external/farbtastic/farbtastic.js", "node_modules/lzma/src/lzma.js", "app/src/hash.js", "app/src/querystring.js", "app/src/model.js", "app/src/themeroller.js" ], + dest: "app/dist/themeroller.all.min.js" + }, + external_lzma_worker: { + src: [ "node_modules/lzma/src/lzma_worker.js" ], + dest: "app/dist/external/lzma_worker.min.js" } + }, + clean: { + appDist: [ "app/dist" ] } -}); +} ); + +// local tasks +grunt.loadTasks( "grunt-tasks" ); function log( callback, successMsg, errorMsg ) { return function( error, result, code ) { if ( error && errorMsg ) { - grunt.log.error( errorMsg + ": " + error.stderr ); - } else if ( ! error && successMsg ) { + grunt.log.error( errorMsg ); + grunt.log.error( error ); + grunt.log.error( result.stdout ); + grunt.log.error( result.stderr ); + } else if ( !error && successMsg ) { grunt.log.ok( successMsg ); } callback( error, result, code ); @@ -77,345 +101,170 @@ function log( callback, successMsg, errorMsg ) { } function cloneOrFetch( callback ) { - async.series([ - function( callback ) { - if ( fs.existsSync( "tmp/jquery-ui" ) ) { - grunt.log.writeln( "Fetch updates for jquery-ui repo" ); - async.series([ - - // Fetch branch heads (even if not referenced by tags), see c08cf67. - function( callback ) { - grunt.util.spawn({ - cmd: "git", - args: [ "fetch" ], - opts: { - cwd: "tmp/jquery-ui" - } - }, callback ); - }, - - // Fetch tags not referenced by heads. Yes, we need both. - function( callback ) { - grunt.util.spawn({ - cmd: "git", - args: [ "fetch", "-t" ], - opts: { - cwd: "tmp/jquery-ui" - } - }, callback ); - } - ], log( callback, "Fetched repo", "Error fetching repo" ) ); - } else { - grunt.log.writeln( "Cloning jquery-ui repo" ); - grunt.util.spawn({ - cmd: "git", - args: [ "clone", "git://github.com/jquery/jquery-ui.git", "jquery-ui" ], - opts: { - cwd: "tmp" - } - }, log( callback, "Cloned repo", "Error cloning repo" ) ); - } - }, - function() { - if ( fs.existsSync( "tmp/api.jqueryui.com" ) ) { - grunt.log.writeln( "Fetch updates for api.jqueryui.com repo" ); - grunt.util.spawn({ + if ( fs.existsSync( "tmp/jquery-ui" ) ) { + grunt.log.writeln( "Fetch updates for jquery-ui repo" ); + async.series( [ + + // Fetch branch heads (even if not referenced by tags), see c08cf67. + function( callback ) { + grunt.util.spawn( { cmd: "git", args: [ "fetch" ], opts: { - cwd: "tmp/api.jqueryui.com" - } - }, log( callback, "Fetched repo", "Error fetching repo" ) ); - } else { - grunt.log.writeln( "Cloning api.jqueryui.com repo" ); - grunt.util.spawn({ - cmd: "git", - args: [ "clone", "git://github.com/jquery/api.jqueryui.com.git", "api.jqueryui.com" ], - opts: { - cwd: "tmp" + cwd: "tmp/jquery-ui" } - }, log( callback, "Cloned repo", "Error cloning repo" ) ); - } - } - ]); -} - -function prepareAll( callback ) { - var config = require( "./lib/config" )(); - - async.forEachSeries( config.jqueryUi, function( jqueryUi, callback ) { - async.series([ - checkout( jqueryUi.ref ), - install, - prepare, - copy( jqueryUi.ref ) - ], function( err ) { - // Go to next ref - callback( err ); - }); - }, function( err ) { - // Done - callback( err ); - }); -} + }, callback ); + }, -function checkout( ref ) { - return function( callback ) { - async.series([ - // Check out jquery-ui + // Fetch tags not referenced by heads. Yes, we need both. function( callback ) { - grunt.log.writeln( "Checking out jquery-ui branch/tag: " + ref ); - grunt.util.spawn({ + grunt.util.spawn( { cmd: "git", - args: [ "checkout", "-f", ref ], + args: [ "fetch", "-t" ], opts: { cwd: "tmp/jquery-ui" } - }, log( callback, "Done with checkout", "Error checking out" ) ); - }, - // Check out api.jqueryui.com - function() { - var docRef = "origin/master"; - async.series([ - // Get the correct documentation for jquery-ui version - function( callback ) { - // If ref is a branch, then get documentation "master" branch. - if ( !(/^\d+.\d+/).test( ref ) ) { - return callback(); - } - // If ref is a tag, then get its corresponding - branch, if available or "master". - grunt.util.spawn({ - cmd: "git", - args: [ "branch", "-a" ], - opts: { - cwd: "tmp/api.jqueryui.com" - } - }, function( error, docBranches ) { - docBranches = String( docBranches ); - if ( error ) { - grunt.log.error( "Error listing branches: " + error.stderr ); - } else { - var correspondingBranch = ref.replace( /^(\d+).(\d+).*/, "$1-$2" ), - isCorrespondingBranch = function( branch ) { - return ( new RegExp( "origin/" + correspondingBranch + "$" ) ).test( branch ); - }; - if ( docBranches.split( "\n" ).some( isCorrespondingBranch ) ) { - docRef = correspondingBranch; - } else { - grunt.log.writeln( "Did not find a \"" + correspondingBranch + "\" branch, using \"master\"" ); - } - callback(); - } - }); - }, - function() { - grunt.log.writeln( "Checking out api.jqueryui.com branch/tag: " + docRef ); - grunt.util.spawn({ - cmd: "git", - args: [ "checkout", "-f", docRef ], - opts: { - cwd: "tmp/api.jqueryui.com" - } - }, log( callback, "Done with checkout", "Error checking out" ) ); - } - ]); + }, callback ); } - ]); - }; -} - -function install( callback ) { - async.series([ - function( callback ) { - grunt.log.writeln( "Installing jquery-ui npm modules" ); - grunt.util.spawn({ - cmd: "npm", - args: [ "prune" ], - opts: { - cwd: "tmp/jquery-ui" - } - }, log( callback, null, "Error pruning npm modules" ) ); - }, - function( callback ) { - grunt.util.spawn({ - cmd: "npm", - args: [ "install" ], - opts: { - cwd: "tmp/jquery-ui" - } - }, log( callback, "Installed npm modules", "Error installing npm modules" ) ); - }, - function( callback ) { - grunt.log.writeln( "Installing api.jqueryui.com npm modules" ); - grunt.util.spawn({ - cmd: "npm", - args: [ "prune" ], - opts: { - cwd: "tmp/api.jqueryui.com" - } - }, log( callback, null, "Error pruning npm modules" ) ); - }, - function() { - grunt.util.spawn({ - cmd: "npm", - args: [ "install" ], - opts: { - cwd: "tmp/api.jqueryui.com" - } - }, log( callback, "Installed npm modules", "Error installing npm modules" ) ); - } - ]); + ], log( callback, "Fetched repo", "Error fetching repo" ) ); + } else { + grunt.log.writeln( "Cloning jquery-ui repo" ); + grunt.util.spawn( { + cmd: "git", + args: [ "clone", "https://github.com/jquery/jquery-ui.git", "jquery-ui" ], + opts: { + cwd: "tmp" + } + }, log( callback, "Cloned repo", "Error cloning repo" ) ); + } } -function prepare( callback ) { - async.series([ - function( callback ) { - grunt.log.writeln( "Building manifest for jQuery UI" ); - grunt.file.expand( "tmp/jquery-ui/*.jquery.json" ).forEach(function( file ) { - grunt.file.delete( file ); - }); - callback(); - }, - function( callback ) { - grunt.util.spawn({ - cmd: "grunt", - args: [ "manifest" ], - opts: { - cwd: "tmp/jquery-ui" - } - }, log( callback, "Done building manifest", "Error building manifest" ) ); - }, - function( callback ) { - grunt.log.writeln( "Building API documentation for jQuery UI" ); - if ( !fs.existsSync( "tmp/api.jqueryui.com/config.json" ) ) { - grunt.file.copy( "tmp/api.jqueryui.com/config-sample.json", "tmp/api.jqueryui.com/config.json" ); - grunt.log.writeln( "Copied config-sample.json to config.json" ); +function checkout( jqueryUi ) { + var ref = jqueryUi.ref; + return function( callback ) { + grunt.log.writeln( "Checking out jquery-ui branch/tag: " + ref ); + grunt.util.spawn( { + cmd: "git", + args: [ "checkout", "-f", ref ], + opts: { + cwd: "tmp/jquery-ui" } - grunt.util.spawn({ - cmd: "grunt", - args: [ "clean", "build" ], - opts: { - cwd: "tmp/api.jqueryui.com" - } - }, log( callback, "Done building documentation", "Error building documentation" ) ); - }, - function() { - grunt.log.writeln( "Building manifest for API documentation for jQuery UI" ); - grunt.util.spawn({ - cmd: "grunt", - args: [ "manifest" ], - opts: { - cwd: "tmp/api.jqueryui.com" - } - }, log( callback, "Done building manifest", "Error building manifest" ) ); - } - ]); + }, log( callback, "Done with checkout", "Error checking out" ) ); + }; } -function copy( ref ) { +function copy( jqueryUi ) { + var ref = jqueryUi.ref; return function( callback ) { - var rimraf = require( "rimraf" ), - version = grunt.file.readJSON( "tmp/jquery-ui/package.json" ).version, - dir = require( "path" ).basename( "tmp/jquery-ui/dist/jquery-ui-" + version ); + var version = grunt.file.readJSON( "tmp/jquery-ui/package.json" ).version; grunt.file.mkdir( "jquery-ui" ); - async.series([ - function( callback ) { + async.series( [ + function( next ) { if ( fs.existsSync( "jquery-ui/" + ref ) ) { grunt.log.writeln( "Cleaning up existing jquery-ui/" + ref ); - rimraf( "jquery-ui/" + ref, log( callback, "Cleaned", "Error cleaning" ) ); + const rmCallback = log( next, "Cleaned", "Error cleaning" ); + fsp.rm( `jquery-ui/${ ref }`, { recursive: true, force: true } ) + .then( () => { + rmCallback( null, "OK", 0 ); + } ) + .catch( error => { + rmCallback( error, null, 1 ); + } ); } else { - callback(); + next(); } }, - function( callback ) { + function() { var from = "tmp/jquery-ui", to = "jquery-ui/" + ref; grunt.log.writeln( "Copying jQuery UI " + version + " over to jquery-ui/" + ref ); try { grunt.file.recurse( from, function( filepath ) { + + // Skip files from the `.git` directory; we don't need them, + // there may be a lot of them and them may include IPC files + // that cannot be copied. + if ( filepath.indexOf( "/.git/" ) === -1 ) { grunt.file.copy( filepath, filepath.replace( new RegExp( "^" + from ), to ) ); - }); - } catch( e ) { + } + } ); + } catch ( e ) { grunt.log.error( "Error copying", e.toString() ); return callback( e ); } grunt.log.ok( "Done copying" ); callback(); - }, - function( callback ) { - var srcpath = "tmp/api.jqueryui.com/dist/wordpress", - destpath = "jquery-ui/" + ref + "/docs/"; - grunt.log.writeln( "Copying API documentation for jQuery UI over to " + destpath ); - grunt.file.copy( srcpath + "/categories.json", destpath + "/categories.json" ); - [ srcpath + "/posts/post", srcpath + "/posts/page" ].forEach(function( srcpath ) { - grunt.file.expand({ filter: "isFile" }, srcpath + "/**" ).forEach(function( file ) { - // OBS: No overwrite check is needed, because the posts/pages basenames must be unique among themselves. - grunt.file.copy( file, file.replace( srcpath, destpath )); - }); - }); - callback(); - }, - function() { - var removePath = ref + "/node_modules"; - grunt.log.writeln( "Cleaning up copied jQuery UI" ); - rimraf( "jquery-ui/" + removePath, log( callback, "Removed jquery-ui/" + removePath, "Error removing jquery-ui/" + removePath ) ); } - ]); + ] ); }; } +function prepareAll( callback ) { + var config = require( "./lib/config" )(); + + async.forEachSeries( config.jqueryUi, function( jqueryUi, callback ) { + async.series( [ + checkout( jqueryUi ), + copy( jqueryUi ) + ], function( err ) { + + // Go to next ref + callback( err ); + } ); + }, function( err ) { + + // Done + callback( err ); + } ); +} + +function packagerZip( packageModule, zipBasedir, themeVars, folder, jqueryUi, callback ) { + var Package = require( packageModule ); + var Packager = require( "node-packager" ); + var filename = path.join( folder, zipBasedir + ".zip" ); + grunt.log.ok( "Building \"" + filename + "\"" ); + if ( fs.existsSync( filename ) ) { + grunt.log.warn( filename + "\" already exists. Skipping..." ); + return callback(); + } + var target = fs.createWriteStream( filename ); + var packager = new Packager( jqueryUi.files().cache, Package, { + components: jqueryUi.components().map( function( component ) { + return component.name; + } ), + jqueryUi: jqueryUi, + themeVars: themeVars + } ); + packager.ready.then( function() { + packager.toZip( target, { + basedir: zipBasedir + }, function( error ) { + if ( error ) { + return callback( error ); + } + callback(); + } ); + } ); +} + function buildPackages( folder, callback ) { - var Builder = require( "./lib/builder" ), - fs = require( "fs" ), - path = require( "path" ), - JqueryUi = require( "./lib/jquery-ui" ), - Packer = require( "./lib/packer" ), - ThemeGallery = require( "./lib/themeroller.themegallery" ), - ThemesPacker = require( "./lib/themes-packer" ); + var JqueryUi = require( "./lib/jquery-ui" ), + ThemeGallery = require( "./lib/themeroller-themegallery" ); // For each jQuery UI release specified in the config file: async.forEachSeries( JqueryUi.all(), function( jqueryUi, callback ) { - var builder = new Builder( jqueryUi, ":all:" ); - - async.series([ + async.series( [ // (a) Build jquery-ui-[VERSION].zip; function( callback ) { - var stream, - theme = new ThemeGallery( jqueryUi )[ 0 ], - packer = new Packer( builder, theme, { bundleSuffix: "" }), - filename = path.join( folder, packer.filename() ); - grunt.log.ok( "Building \"" + filename + "\"" ); - if ( fs.existsSync( filename ) ) { - grunt.log.warn( filename + "\" already exists. Skipping..." ); - return callback(); - } - stream = fs.createWriteStream( filename ); - packer.zipTo( stream, function( error, result ) { - if ( error ) { - return callback( error ); - } - return callback(); - }); + packagerZip( "./lib/package", "jquery-ui-" + jqueryUi.pkg.version, + new ThemeGallery( jqueryUi )[ 0 ].vars, folder, jqueryUi, callback ); }, // (b) Build themes package jquery-ui-themes-[VERSION].zip; function( callback ) { - var stream, - packer = new ThemesPacker( builder ), - filename = path.join( folder, packer.filename() ); - grunt.log.ok( "Building \"" + filename + "\"" ); - if ( fs.existsSync( filename ) ) { - grunt.log.warn( filename + "\" already exists. Skipping..." ); - return callback(); - } - stream = fs.createWriteStream( filename ); - packer.zipTo( stream, function( error, result ) { - if ( error ) { - return callback( error ); - } - return callback(); - }); + packagerZip( "./lib/package-themes", "jquery-ui-themes-" + jqueryUi.pkg.version, + null, folder, jqueryUi, callback ); } ], function( error ) { @@ -423,43 +272,59 @@ function buildPackages( folder, callback ) { grunt.log.error( error.message ); } return callback(); - }); + } ); }, callback ); } -grunt.registerTask( "default", [ "check-modules", "jshint" ] ); +grunt.registerTask( "default", [ "check-modules", "eslint", "test" ] ); -grunt.registerTask( "build-app", [ "handlebars", "uglify" ] ); +grunt.registerTask( "build-app", [ "clean", "handlebars", "copy", "minify" ] ); grunt.registerTask( "build-packages", "Builds zip package of each jQuery UI release specified in config file with all components and lightness theme, inside the given folder", function( folder ) { var done = this.async(); - buildPackages( folder, function( err ) { + buildPackages( folder, function( err ) { + // Make grunt to quit properly. Here, a proper error message should have been printed already. // 1: true on success, false on error done( !err /* 1 */ ); - }); -}); + } ); +} ); grunt.registerTask( "mkdirs", "Create directories", function() { - [ "app/resources/template", "log", "tmp" ].forEach(function( dir ) { + [ "log", "tmp" ].forEach( function( dir ) { if ( !fs.existsSync( dir ) ) { grunt.file.mkdir( dir ); } - }); -}); + } ); +} ); -grunt.registerTask( "prepare", [ "check-modules", "mkdirs", "prepare-jquery-ui", "build-app" ] ); +grunt.registerTask( "prepare", [ + "check-modules", + "eslint", + "mkdirs", + "prepare-jquery-ui", + "build-app" +] ); grunt.registerTask( "prepare-jquery-ui", "Fetches and builds jQuery UI releases specified in config file", function() { var done = this.async(); - async.series([ + async.series( [ cloneOrFetch, prepareAll ], function( err ) { + // Make grunt to quit properly. Here, a proper error message should have been printed already. // 1: true on success, false on error done( !err /* 1 */ ); - }); -}); + } ); +} ); + +grunt.registerTask( "test", "Runs npm test", function() { + var done = this.async(); + grunt.util.spawn( { + cmd: "npm", + args: [ "test" ] + }, done ); +} ); }; diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 00000000..d635eea7 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,36 @@ +Copyright OpenJS Foundation and other contributors, https://openjsf.org/ + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/jquery/download.jqueryui.com + +The following license applies to all parts of this software except as +documented below: + +==== + +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. + +==== + +All files located in the node_modules and external directories are +externally maintained libraries used by this software which have their +own licenses; we recommend you read them, as their terms may differ from +the terms above. diff --git a/README.md b/README.md index 0e0dc21d..c85326b0 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,9 @@ jQuery UI DownloadBuilder & ThemeRoller backend and frontend application. ## Requirements -- node >= 0.8.x. -- ImageMagick 6.6.x. (see apendix below for instructions to compile it from source) -- npm. -- grunt-cli. (installed globally via npm) -- [api.jquery.com](https://github.com/jquery/api.jquery.com) requirements. +- [node >=18 and npm](https://nodejs.org/en/download/) +- ImageMagick 7.x. ([See below for instructions how to install it](#install-imagemagick)) +- grunt-cli: `npm install -g grunt-cli` ## Getting Started @@ -32,31 +30,34 @@ Go to the URL it outputs. Use the config file to define which jQueryUI version DownloadBuilder should serve. Eg: ``` -"jqueryUi": { - "stable": { // required - "version": "1.10.0" - "dependsOn": "jQuery 1.7+" +"jqueryUi": [ + { + "version": "1.14.1" + "dependsOn": "jQuery 1.12+ / 2.2+ / 3.6+ / 4.0+", + "label": "Stable", + "stable": true }, - "legacy": { // optional - "version": "1.9.1" - "dependsOn": "jQuery 1.6+" + { + "version": "1.13.3" + "dependsOn": "jQuery 1.8+", + "label": "Legacy" } } ``` -The `stable` release is required, but `legacy` is optional. Each release has the following attributes: +One version with the `stable` property set to `true` is required. Each release has the following attributes: - `version` is a String, can be a tag or a branch of jQuery UI. Note: use `repo/branch` eg. `origin/master` when defining a branch. - `dependsOn` is a String, any textual value allowed. -- `path` [optional] can be used instead of `version` to straight point to the prepared release path. +- `label` is a boolean, describing the lifecycle of this version, like "Stable", "Legacy" or "Beta". +- `stable` is a boolean, marking the current stable release. This will be selected by default in the web UI and will be used to generate demo files. ### node server.js Use `node server.js` to run the server. Arguments: -- `--console` output to console instead of syslog (via simple-log module); -- `--host ` specify custom host. Default localhost; +- `--host=` specify custom host. Default localhost; - `--nocache` skip caching release files and theme images; -- `--port ` specify custom port. Default 8088; +- `--port=` specify custom port. Default 8088; ### Test @@ -64,40 +65,42 @@ Use `node server.js` to run the server. Arguments: Use `npm test` to run the unit tests. -## Deploy on WP - -On [jqueryui.com](https://github.com/jquery/jqueryui.com), run `grunt deploy` [note, run that on jqueryui.com repo]. More details on its README. - -### Local testing +## Local testing in WordPress Here's how to do integration testing with WordPress: -Symlink your local download.jqueryui.com module on jqueryui.com. -``` +Link your local `download.jqueryui.com` module on `jqueryui.com`. +```sh $ cd $ npm link +$ node server.js --console + $ cd $ npm link download.jqueryui.com ``` -Temporarily change its `grunt.js` to use localhost instead of http://download.jqueryui.com. +Temporarily change its `Gruntfile.js` to use localhost instead of https://download.jqueryui.com. ```diff var frontend = require( "download.jqueryui.com" ).frontend({ -- host: "http://download.jqueryui.com" +- host: "https://download.jqueryui.com" + host: "http://localhost:8088", env: "production" }), ``` +Then deploy: +```sh +$ grunt deploy +``` + ## Appendix -### Compile and install ImageMagick from source +### Install ImageMagick + +You will need ImageMagic `7.x` with PNG support. If your distribution doesn't provide such a version (on macOS it is included in the `imagemagick` Homebrew package), you will need to compile ImageMagick from source. -Commands: +Follow instructions from https://imagemagick.org/script/install-source.php to install ImageMagic `7.x`. Then, in the ImageMagick directory, invoke: ``` -$ wget http://www.imagemagick.org/download/legacy/ImageMagick-6.6.9-10.tar.gz -$ tar -xzf ImageMagick-6.6.9-10.tar.gz -$ cd ImageMagick-6.6.9-10 $ ./configure CFLAGS=-O5 CXXFLAGS=-O5 --prefix=/opt --enable-static --with-png --disable-shared ``` @@ -106,7 +109,7 @@ Make sure you have the below in the output. PNG --with-png=yes yes ``` -If "png=yes no", libpng is missing and needs to be installed, `apt-get install libpng-dev` on linux or `brew install libpng` on OS X. +If "png=yes no", `libpng` is missing and needs to be installed, `apt-get install libpng-dev` on linux or `brew install libpng` on macOS. Continuing... ``` @@ -119,8 +122,8 @@ export DYLD_LIBRARY_PATH="$MAGICK_HOME/lib/" Make sure you get the right bin when running it. ``` -$ which convert -/opt/bin/convert +$ which magick +/opt/bin/magick ``` -Hint: add those export statements into your .bash_profile. +Hint: add those export statements into your `.bash_profile`. diff --git a/app/resources/external/lzma_worker.min.js b/app/resources/external/lzma_worker.min.js deleted file mode 100644 index 7ee217c5..00000000 --- a/app/resources/external/lzma_worker.min.js +++ /dev/null @@ -1,4 +0,0 @@ -var LZMA,action_compress=1,action_decompress=2,action_update=3;function update_progress(percent,callback_num){postMessage({action:3,callback_num:callback_num,result:percent})}LZMA=function(){var $moduleName,$moduleBase;var _,N8000000000000000_longLit=[0,-0x8000000000000000],N1_longLit=[4294967295,-4294967296],P0_longLit=[0,0],P1_longLit=[1,0],P4_longLit=[4,0],P1000_longLit=[4096,0],Pffffff_longLit=[16777215,0],P1000000_longLit=[16777216,0],Pff000000_longLit=[4278190080,0],Pffffffff_longLit=[4294967295,0],P7fffffffffffffff_longLit=[4294967295,0x7fffffff00000000];function getClass_18(){return Ljava_lang_Object_2_classLit}function Object_0(){}_=Object_0.prototype={};_.getClass$=getClass_18;_.typeMarker$=nullMethod;_.typeId$=1;function getClass_22(){return Ljava_lang_Throwable_2_classLit}function Throwable(){}_=Throwable.prototype=new Object_0;_.getClass$=getClass_22;_.typeId$=3;_.detailMessage=null;function getClass_13(){return Ljava_lang_Exception_2_classLit}function Exception(){}_=Exception.prototype=new Throwable;_.getClass$=getClass_13;_.typeId$=4;function $RuntimeException(this$static,message){this$static.detailMessage=message;return this$static}function getClass_19(){return Ljava_lang_RuntimeException_2_classLit}function RuntimeException(){}_=RuntimeException.prototype=new Exception;_.getClass$=getClass_19;_.typeId$=5;function $JavaScriptException(this$static,e){return this$static}function getClass_0(){return Lcom_google_gwt_core_client_JavaScriptException_2_classLit}function JavaScriptException(){}_=JavaScriptException.prototype=new RuntimeException;_.getClass$=getClass_0;_.typeId$=6;function $append(a,x){a[a.explicitLength++]=x}function $appendNonNull(a,x){a[a.explicitLength++]=x}function $toString(a){var s_0,s;s_0=(s=a.join(""),a.length=a.explicitLength=0,s);a[a.explicitLength++]=s_0;return s_0}function createFromSeed(seedType,length_0){var array=new Array(length_0);if(seedType>0){var value=[null,0,false,[0,0]][seedType];for(var i=0;i0&&!canCastUnsafe(value.typeId$,array.queryId$)){throw new ArrayStoreException}if(array.queryId$<0&&(value.typeMarker$==nullMethod||value.typeId$==2)){throw new ArrayStoreException}}return array[index]=value}function Array_0(){}_=Array_0.prototype=new Object_0;_.getClass$=getClass_2;_.typeId$=0;_.arrayClass$=null;_.length=0;_.queryId$=0;function $clinit_4(){$clinit_4=nullMethod;expandoNames_0=[];expandoValues_0=[];initExpandos(new Array_0,expandoNames_0,expandoValues_0)}function initExpandos(protoType,expandoNames,expandoValues){var i=0,value;for(var name_0 in protoType){if(value=protoType[name_0]){expandoNames[i]=name_0;expandoValues[i]=value;++i}}}function wrapArray(array,expandoNames,expandoValues){$clinit_4();for(var i=0,c=expandoNames.length;i<0){return-1}else{return 1}}function create(valueLow,valueHigh){var diffHigh,diffLow;valueHigh%=0x10000000000000000;valueLow%=0x10000000000000000;diffHigh=valueHigh%4294967296;diffLow=Math.floor(valueLow/4294967296)*4294967296;valueHigh=valueHigh-diffHigh+diffLow;valueLow=valueLow-diffLow+diffHigh;while(valueLow<0){valueLow+=4294967296;valueHigh-=4294967296}while(valueLow>4294967295){valueLow-=4294967296;valueHigh+=4294967296}valueHigh=valueHigh%0x10000000000000000;while(valueHigh>0x7fffffff00000000){valueHigh-=0x10000000000000000}while(valueHigh<-0x8000000000000000){valueHigh+=0x10000000000000000}return[valueLow,valueHigh]}function div(a,b){var approx,deltaRem,deltaResult,halfa,rem,result;if(b[0]==0&&b[1]==0){throw $ArithmeticException(new ArithmeticException,"/ by zero")}if(a[0]==0&&a[1]==0){return $clinit_10(),ZERO}if(eq(a,($clinit_10(),MIN_VALUE))){if(eq(b,ONE)||eq(b,NEG_ONE)){return MIN_VALUE}halfa=shr(a,1);approx=shl(div(halfa,b),1);rem=sub(a,mul(b,approx));return add(approx,div(rem,b))}if(eq(b,MIN_VALUE)){return ZERO}if(a[1]<0){if(b[1]<0){return div(neg(a),neg(b))}else{return neg(div(neg(a),b))}}if(b[1]<0){return neg(div(a,neg(b)))}result=ZERO;rem=a;while(compare(rem,b)>=0){deltaResult=fromDouble(Math.floor(toDoubleRoundDown(rem)/toDoubleRoundUp(b)));if(deltaResult[0]==0&&deltaResult[1]==0){deltaResult=ONE}deltaRem=mul(deltaResult,b);result=add(result,deltaResult);rem=sub(rem,deltaRem)}return result}function eq(a,b){return a[0]==b[0]&&a[1]==b[1]}function fromDouble(value){if(isNaN(value)){return $clinit_10(),ZERO}if(value<-0x8000000000000000){return $clinit_10(),MIN_VALUE}if(value>=0x8000000000000000){return $clinit_10(),MAX_VALUE}if(value>0){return create(Math.floor(value),0)}else{return create(Math.ceil(value),0)}}function fromInt(value){var rebase,result;if(value>-129&&value<128){rebase=value+128;result=$clinit_9(),boxedValues[rebase];if(result==null){result=boxedValues[rebase]=internalFromInt(value)}return result}return internalFromInt(value)}function internalFromInt(value){if(value>=0){return[value,0]}else{return[value+4294967296,-4294967296]}}function lowBits_0(a){if(a[0]>=2147483648){return~~Math.max(Math.min(a[0]-4294967296,2147483647),-2147483648)}else{return~~Math.max(Math.min(a[0],2147483647),-2147483648)}}function makeFromBits(highBits,lowBits){var high,low;high=highBits*4294967296;low=lowBits;if(lowBits<0){low+=4294967296}return[low,high]}function mul(a,b){var a1,a2,a3,a4,b1,b2,b3,b4,res;if(a[0]==0&&a[1]==0){return $clinit_10(),ZERO}if(b[0]==0&&b[1]==0){return $clinit_10(),ZERO}if(eq(a,($clinit_10(),MIN_VALUE))){return multByMinValue(b)}if(eq(b,MIN_VALUE)){return multByMinValue(a)}if(a[1]<0){if(b[1]<0){return mul(neg(a),neg(b))}else{return neg(mul(neg(a),b))}}if(b[1]<0){return neg(mul(a,neg(b)))}if(compare(a,TWO_PWR_24)<0&&compare(b,TWO_PWR_24)<0){return create((a[1]+a[0])*(b[1]+b[0]),0)}a3=a[1]%281474976710656;a4=a[1]-a3;a1=a[0]%65536;a2=a[0]-a1;b3=b[1]%281474976710656;b4=b[1]-b3;b1=b[0]%65536;b2=b[0]-b1;res=ZERO;res=addTimes(res,a4,b1);res=addTimes(res,a3,b2);res=addTimes(res,a3,b1);res=addTimes(res,a2,b3);res=addTimes(res,a2,b2);res=addTimes(res,a2,b1);res=addTimes(res,a1,b4);res=addTimes(res,a1,b3);res=addTimes(res,a1,b2);res=addTimes(res,a1,b1);return res}function multByMinValue(a){if((lowBits_0(a)&1)==1){return $clinit_10(),MIN_VALUE}else{return $clinit_10(),ZERO}}function neg(a){var newHigh,newLow;if(eq(a,($clinit_10(),MIN_VALUE))){return MIN_VALUE}newHigh=-a[1];newLow=-a[0];if(newLow>4294967295){newLow-=4294967296;newHigh+=4294967296}if(newLow<0){newLow+=4294967296;newHigh-=4294967296}return[newLow,newHigh]}function pwrAsDouble(n){if(n<=30){return 1<<0){return neg(shl(neg(a),n))}twoToN=pwrAsDouble(n);newHigh=a[1]*twoToN%0x10000000000000000;newLow=a[0]*twoToN;diff=newLow-newLow%4294967296;newHigh+=diff;newLow-=diff;if(newHigh>=0x8000000000000000){newHigh-=0x10000000000000000}return[newLow,newHigh]}function shr(a,n){var newHigh,newLow,shiftFact;n&=63;shiftFact=pwrAsDouble(n);newHigh=a[1]/shiftFact;newLow=Math.floor(a[0]/shiftFact);return create(newLow,newHigh)}function shru(a,n){var sr;n&=63;sr=shr(a,n);if(a[1]<0){sr=add(sr,shl(($clinit_10(),TWO),63-n))}return sr}function sub(a,b){var newHigh,newLow;newHigh=a[1]-b[1];newLow=a[0]-b[0];return create(newLow,newHigh)}function toDoubleRoundDown(a){var diff,magnitute,toSubtract;magnitute=round_int(Math.log(a[1])/($clinit_10(),LN_2));if(magnitute<=48){return a[1]+a[0]}else{diff=magnitute-48;toSubtract=(1<0;--zeroesNeeded){digits="0"+digits}}res=digits+res}return res}function $clinit_9(){$clinit_9=nullMethod;boxedValues=initDim(_3_3D_classLit,0,9,256,0)}var boxedValues;function $clinit_10(){$clinit_10=nullMethod;LN_2=Math.log(2);MAX_VALUE=P7fffffffffffffff_longLit;MIN_VALUE=N8000000000000000_longLit;NEG_ONE=fromInt(-1);ONE=fromInt(1);TWO=fromInt(2);TWO_PWR_24=P1000000_longLit;ZERO=fromInt(0)}var LN_2,MAX_VALUE,MIN_VALUE,NEG_ONE,ONE,TWO,TWO_PWR_24,ZERO;function getClass_6(){return Ljava_io_InputStream_2_classLit}function InputStream(){}_=InputStream.prototype=new Object_0;_.getClass$=getClass_6;_.typeId$=0;function $ByteArrayInputStream(this$static,buf){$ByteArrayInputStream_0(this$static,buf,0,buf.length);return this$static}function $ByteArrayInputStream_0(this$static,buf,off,len){this$static.buf=buf;this$static.pos=off;this$static.count=off+len;if(this$static.count>buf.length)this$static.count=buf.length;return this$static}function $read(this$static){if(this$static.pos>=this$static.count)return-1;return this$static.buf[this$static.pos++]&255}function $read_0(this$static,buf,off,len){if(this$static.pos>=this$static.count)return-1;len=min(len,this$static.count-this$static.pos);arraycopy(this$static.buf,this$static.pos,buf,off,len);this$static.pos+=len;return len}function getClass_3(){return Ljava_io_ByteArrayInputStream_2_classLit}function ByteArrayInputStream(){}_=ByteArrayInputStream.prototype=new InputStream;_.getClass$=getClass_3;_.typeId$=0;_.buf=null;_.count=0;_.pos=0;function getClass_7(){return Ljava_io_OutputStream_2_classLit}function OutputStream(){}_=OutputStream.prototype=new Object_0;_.getClass$=getClass_7;_.typeId$=0;function $ByteArrayOutputStream(this$static){this$static.buf=initDim(_3B_classLit,0,-1,32,1);return this$static}function $ensureCapacity(this$static,len){var newbuf;if(len<=this$static.buf.length)return;len=max(len,this$static.buf.length*2);newbuf=initDim(_3B_classLit,0,-1,len,1);arraycopy(this$static.buf,0,newbuf,0,this$static.buf.length);this$static.buf=newbuf}function $toByteArray(this$static){var data;data=initDim(_3B_classLit,0,-1,this$static.count,1);arraycopy(this$static.buf,0,data,0,this$static.count);return data}function $write(this$static,b){$ensureCapacity(this$static,this$static.count+1);this$static.buf[this$static.count++]=b<<24>>24}function $write_0(this$static,buf,off,len){$ensureCapacity(this$static,this$static.count+len);arraycopy(buf,off,this$static.buf,this$static.count,len);this$static.count+=len}function getClass_4(){return Ljava_io_ByteArrayOutputStream_2_classLit}function ByteArrayOutputStream(){}_=ByteArrayOutputStream.prototype=new OutputStream;_.getClass$=getClass_4;_.typeId$=0;_.buf=null;_.count=0;function $IOException(this$static,message){this$static.detailMessage=message;return this$static}function getClass_5(){return Ljava_io_IOException_2_classLit}function IOException(){}_=IOException.prototype=new Exception;_.getClass$=getClass_5;_.typeId$=7;function $ArithmeticException(this$static,explanation){this$static.detailMessage=explanation;return this$static}function getClass_8(){return Ljava_lang_ArithmeticException_2_classLit}function ArithmeticException(){}_=ArithmeticException.prototype=new RuntimeException;_.getClass$=getClass_8;_.typeId$=8;function $ArrayStoreException(this$static,message){this$static.detailMessage=message;return this$static}function getClass_9(){return Ljava_lang_ArrayStoreException_2_classLit}function ArrayStoreException(){}_=ArrayStoreException.prototype=new RuntimeException;_.getClass$=getClass_9;_.typeId$=9;function createForArray(packageName,className){var clazz;clazz=new Class;clazz.typeName=packageName+className;return clazz}function createForClass(packageName,className){var clazz;clazz=new Class;clazz.typeName=packageName+className;return clazz}function createForEnum(packageName,className){var clazz;clazz=new Class;clazz.typeName=packageName+className;return clazz}function getClass_11(){return Ljava_lang_Class_2_classLit}function Class(){}_=Class.prototype=new Object_0;_.getClass$=getClass_11;_.typeId$=0;_.typeName=null;function getClass_10(){return Ljava_lang_ClassCastException_2_classLit}function ClassCastException(){}_=ClassCastException.prototype=new RuntimeException;_.getClass$=getClass_10;_.typeId$=12;function getClass_12(){return Ljava_lang_Enum_2_classLit}function Enum(){}_=Enum.prototype=new Object_0;_.getClass$=getClass_12;_.typeId$=0;function $IllegalArgumentException(this$static,message){this$static.detailMessage=message;return this$static}function getClass_14(){return Ljava_lang_IllegalArgumentException_2_classLit}function IllegalArgumentException(){}_=IllegalArgumentException.prototype=new RuntimeException;_.getClass$=getClass_14;_.typeId$=13;function getClass_15(){return Ljava_lang_IllegalStateException_2_classLit}function IllegalStateException(){}_=IllegalStateException.prototype=new RuntimeException;_.getClass$=getClass_15;_.typeId$=14;function getClass_16(){return Ljava_lang_IndexOutOfBoundsException_2_classLit}function IndexOutOfBoundsException(){}_=IndexOutOfBoundsException.prototype=new RuntimeException;_.getClass$=getClass_16;_.typeId$=15;function max(x,y){return x>y?x:y}function min(x,y){return xsrclen||destOfs+len>destlen){throw new IndexOutOfBoundsException}if((srcTypeName.charCodeAt(1)==76||srcTypeName.charCodeAt(1)==91)&&!$equals(srcTypeName,destTypeName)){srcArray=dynamicCast(src,3);destArray=dynamicCast(dest,3);if((src==null?null:src)===(dest==null?null:dest)&&srcOfsdestOfs;){setCheck(destArray,destEnd,srcArray[--srcOfs])}}else{for(destEnd=destOfs+len;destOfs<<0)throw $IllegalArgumentException(new IllegalArgumentException,"invalid length "+toString_0(length_0));this$static.length_0=length_0;encoder=$Encoder(new Encoder);$configure(mode,encoder);encoder._writeEndMark=true;$WriteCoderProperties(encoder,output);for(i=0;i<64;i+=8)$write(output,lowBits_0(shr(length_0,i))&255);this$static.chunker=(encoder._needReleaseMFStream=false,encoder._inStream=input,encoder._finished=false,$Create_2(encoder),encoder._rangeEncoder.Stream=output,$Init_4(encoder),$FillDistancesPrices(encoder),$FillAlignPrices(encoder),encoder._lenEncoder._tableSize=encoder._numFastBytes+1-2,$UpdateTables(encoder._lenEncoder,1<<>24}decoder=$Decoder(new Decoder);if(!$SetDecoderProperties(decoder,properties))throw $IOException(new IOException,"corrupted input");for(i=0;i<64;i+=8){r=$read(input);if(r==-1)throw $IOException(new IOException,"truncated input");r=r.toString(16);if(r.length==1)r="0"+r;hex_length=r+""+hex_length}if(hex_length.toLowerCase()=="ffffffffffffffffff"||hex_length==0){this$static.length_0=N1_longLit}else{tmp_length=parseInt(hex_length,16);if(tmp_length>4294967295){this$static.length_0=N1_longLit}else{this$static.length_0=fromDouble(tmp_length)}}this$static.chunker=$CodeInChunks(decoder,input,output,this$static.length_0)}function getClass_27(){return Lorg_dellroad_lzma_client_LZMADecompressor_2_classLit}function LZMADecompressor(){}_=LZMADecompressor.prototype=new Object_0;_.getClass$=getClass_27;_.typeId$=0;_.chunker=null;_.exception=null;_.length_0=P0_longLit;function $LZMAByteArrayDecompressor(this$static,data){this$static.output=$ByteArrayOutputStream(new ByteArrayOutputStream);$init_0(this$static,$ByteArrayInputStream(new ByteArrayInputStream,data),this$static.output);return this$static}function getClass_25(){return Lorg_dellroad_lzma_client_LZMAByteArrayDecompressor_2_classLit}function LZMAByteArrayDecompressor(){}_=LZMAByteArrayDecompressor.prototype=new LZMADecompressor;_.getClass$=getClass_25;_.typeId$=0;_.output=null;function $Create_4(this$static,keepSizeBefore,keepSizeAfter,keepSizeReserv){var blockSize;this$static._keepSizeBefore=keepSizeBefore;this$static._keepSizeAfter=keepSizeAfter;blockSize=keepSizeBefore+keepSizeAfter+keepSizeReserv;if(this$static._bufferBase==null||this$static._blockSize!=blockSize){this$static._bufferBase=null;this$static._blockSize=blockSize;this$static._bufferBase=initDim(_3B_classLit,0,-1,this$static._blockSize,1)}this$static._pointerToLastSafePosition=this$static._blockSize-keepSizeAfter}function $GetIndexByte(this$static,index){return this$static._bufferBase[this$static._bufferOffset+this$static._pos+index]}function $GetMatchLen(this$static,index,distance,limit){var i,pby;if(this$static._streamEndWasReached){if(this$static._pos+index+limit>this$static._streamPos){limit=this$static._streamPos-(this$static._pos+index)}}++distance;pby=this$static._bufferOffset+this$static._pos+index;for(i=0;i0){--offset}numBytes=this$static._bufferOffset+this$static._streamPos-offset;for(i=0;ithis$static._posLimit){pointerToPostion=this$static._bufferOffset+this$static._pos;if(pointerToPostion>this$static._pointerToLastSafePosition){$MoveBlock(this$static)}$ReadBlock(this$static)}}function $ReadBlock(this$static){var numReadBytes,pointerToPostion,size;if(this$static._streamEndWasReached)return;while(true){size=-this$static._bufferOffset+this$static._blockSize-this$static._streamPos;if(size==0)return;numReadBytes=$read_0(this$static._stream,this$static._bufferBase,this$static._bufferOffset+this$static._streamPos,size);if(numReadBytes==-1){this$static._posLimit=this$static._streamPos;pointerToPostion=this$static._bufferOffset+this$static._posLimit;if(pointerToPostion>this$static._pointerToLastSafePosition){this$static._posLimit=this$static._pointerToLastSafePosition-this$static._bufferOffset}this$static._streamEndWasReached=true;return}this$static._streamPos+=numReadBytes;if(this$static._streamPos>=this$static._pos+this$static._keepSizeAfter){this$static._posLimit=this$static._streamPos-this$static._keepSizeAfter}}}function $ReduceOffsets(this$static,subValue){this$static._bufferOffset+=subValue;this$static._posLimit-=subValue;this$static._pos-=subValue;this$static._streamPos-=subValue}function getClass_40(){return Lorg_dellroad_lzma_client_SevenZip_Compression_LZ_InWindow_2_classLit}function InWindow(){}_=InWindow.prototype=new Object_0;_.getClass$=getClass_40;_.typeId$=0;_._blockSize=0;_._bufferBase=null;_._bufferOffset=0;_._keepSizeAfter=0;_._keepSizeBefore=0;_._pointerToLastSafePosition=0;_._pos=0;_._posLimit=0;_._stream=null;_._streamEndWasReached=false;_._streamPos=0;function $clinit_60(){$clinit_60=nullMethod;var i,j,r;CrcTable=initDim(_3I_classLit,0,-1,256,1);for(i=0;i<256;++i){r=i;for(j=0;j<8;++j)if((r&1)!=0){r=r>>>1^-306674912}else{r>>>=1}CrcTable[i]=r}}function $Create_3(this$static,historySize,keepAddBufferBefore,matchMaxLen,keepAddBufferAfter){var cyclicBufferSize,hs,windowReservSize;if(historySize>1073741567){return false}this$static._cutValue=16+(matchMaxLen>>1);windowReservSize=~~((historySize+keepAddBufferBefore+matchMaxLen+keepAddBufferAfter)/2)+256;$Create_4(this$static,historySize+keepAddBufferBefore,matchMaxLen+keepAddBufferAfter,windowReservSize);this$static._matchMaxLen=matchMaxLen;cyclicBufferSize=historySize+1;if(this$static._cyclicBufferSize!=cyclicBufferSize){this$static._son=initDim(_3I_classLit,0,-1,(this$static._cyclicBufferSize=cyclicBufferSize)*2,1)}hs=65536;if(this$static.HASH_ARRAY){hs=historySize-1;hs|=hs>>1;hs|=hs>>2;hs|=hs>>4;hs|=hs>>8;hs>>=1;hs|=65535;if(hs>16777216)hs>>=1;this$static._hashMask=hs;++hs;hs+=this$static.kFixHashSize}if(hs!=this$static._hashSizeSum){this$static._hash=initDim(_3I_classLit,0,-1,this$static._hashSizeSum=hs,1)}return true}function $GetMatches(this$static,distances){var count,cur,curMatch,curMatch2,curMatch3,cyclicPos,delta,hash2Value,hash3Value,hashValue,len,len0,len1,lenLimit,matchMinPos,maxLen,offset,pby1,ptr0,ptr1,temp;if(this$static._pos+this$static._matchMaxLen<=this$static._streamPos){lenLimit=this$static._matchMaxLen}else{lenLimit=this$static._streamPos-this$static._pos;if(lenLimitthis$static._cyclicBufferSize?this$static._pos-this$static._cyclicBufferSize:0;cur=this$static._bufferOffset+this$static._pos;maxLen=1;hash2Value=0;hash3Value=0;if(this$static.HASH_ARRAY){temp=CrcTable[this$static._bufferBase[cur]&255]^this$static._bufferBase[cur+1]&255;hash2Value=temp&1023;temp^=(this$static._bufferBase[cur+2]&255)<<8;hash3Value=temp&65535;hashValue=(temp^CrcTable[this$static._bufferBase[cur+3]&255]<<5)&this$static._hashMask}else{hashValue=this$static._bufferBase[cur]&255^(this$static._bufferBase[cur+1]&255)<<8}curMatch=this$static._hash[this$static.kFixHashSize+hashValue];if(this$static.HASH_ARRAY){curMatch2=this$static._hash[hash2Value];curMatch3=this$static._hash[1024+hash3Value];this$static._hash[hash2Value]=this$static._pos;this$static._hash[1024+hash3Value]=this$static._pos;if(curMatch2>matchMinPos){if(this$static._bufferBase[this$static._bufferOffset+curMatch2]==this$static._bufferBase[cur]){distances[offset++]=maxLen=2;distances[offset++]=this$static._pos-curMatch2-1}}if(curMatch3>matchMinPos){if(this$static._bufferBase[this$static._bufferOffset+curMatch3]==this$static._bufferBase[cur]){if(curMatch3==curMatch2){offset-=2}distances[offset++]=maxLen=3;distances[offset++]=this$static._pos-curMatch3-1;curMatch2=curMatch3}}if(offset!=0&&curMatch2==curMatch){offset-=2;maxLen=1}}this$static._hash[this$static.kFixHashSize+hashValue]=this$static._pos;ptr0=(this$static._cyclicBufferPos<<1)+1;ptr1=this$static._cyclicBufferPos<<1;len0=len1=this$static.kNumHashDirectBytes;if(this$static.kNumHashDirectBytes!=0){if(curMatch>matchMinPos){if(this$static._bufferBase[this$static._bufferOffset+curMatch+this$static.kNumHashDirectBytes]!=this$static._bufferBase[cur+this$static.kNumHashDirectBytes]){distances[offset++]=maxLen=this$static.kNumHashDirectBytes;distances[offset++]=this$static._pos-curMatch-1}}}count=this$static._cutValue;while(true){if(curMatch<=matchMinPos||count--==0){this$static._son[ptr0]=this$static._son[ptr1]=0;break}delta=this$static._pos-curMatch;cyclicPos=(delta<=this$static._cyclicBufferPos?this$static._cyclicBufferPos-delta:this$static._cyclicBufferPos-delta+this$static._cyclicBufferSize)<<1;pby1=this$static._bufferOffset+curMatch;len=len0<(this$static._bufferBase[cur+len]&255)){this$static._son[ptr1]=curMatch;ptr1=cyclicPos+1;curMatch=this$static._son[ptr1];len1=len}else{this$static._son[ptr0]=curMatch;ptr0=cyclicPos;curMatch=this$static._son[ptr0];len0=len}}$MovePos_0(this$static);return offset}function $Init_5(this$static){var i;this$static._bufferOffset=0;this$static._pos=0;this$static._streamPos=0;this$static._streamEndWasReached=false;$ReadBlock(this$static);for(i=0;i=this$static._cyclicBufferSize){this$static._cyclicBufferPos=0}$MovePos_1(this$static);if(this$static._pos==1073741823){subValue=this$static._pos-this$static._cyclicBufferSize;$NormalizeLinks(this$static._son,this$static._cyclicBufferSize*2,subValue);$NormalizeLinks(this$static._hash,this$static._hashSizeSum,subValue);$ReduceOffsets(this$static,subValue)}}function $NormalizeLinks(items,numItems,subValue){var i,value;for(i=0;i<=subValue){value=0}else{value-=subValue}items[i]=value}}function $SetType(this$static,numHashBytes){this$static.HASH_ARRAY=numHashBytes>2;if(this$static.HASH_ARRAY){this$static.kNumHashDirectBytes=0;this$static.kMinMatchCheck=4;this$static.kFixHashSize=66560}else{this$static.kNumHashDirectBytes=2;this$static.kMinMatchCheck=3;this$static.kFixHashSize=0}}function $Skip(this$static,num){var count,cur,curMatch,cyclicPos,delta,hash2Value,hash3Value,hashValue,len,len0,len1,lenLimit,matchMinPos,pby1,ptr0,ptr1,temp;do{if(this$static._pos+this$static._matchMaxLen<=this$static._streamPos){lenLimit=this$static._matchMaxLen}else{lenLimit=this$static._streamPos-this$static._pos;if(lenLimitthis$static._cyclicBufferSize?this$static._pos-this$static._cyclicBufferSize:0;cur=this$static._bufferOffset+this$static._pos;if(this$static.HASH_ARRAY){temp=CrcTable[this$static._bufferBase[cur]&255]^this$static._bufferBase[cur+1]&255;hash2Value=temp&1023;this$static._hash[hash2Value]=this$static._pos;temp^=(this$static._bufferBase[cur+2]&255)<<8;hash3Value=temp&65535;this$static._hash[1024+hash3Value]=this$static._pos;hashValue=(temp^CrcTable[this$static._bufferBase[cur+3]&255]<<5)&this$static._hashMask}else{hashValue=this$static._bufferBase[cur]&255^(this$static._bufferBase[cur+1]&255)<<8 -}curMatch=this$static._hash[this$static.kFixHashSize+hashValue];this$static._hash[this$static.kFixHashSize+hashValue]=this$static._pos;ptr0=(this$static._cyclicBufferPos<<1)+1;ptr1=this$static._cyclicBufferPos<<1;len0=len1=this$static.kNumHashDirectBytes;count=this$static._cutValue;while(true){if(curMatch<=matchMinPos||count--==0){this$static._son[ptr0]=this$static._son[ptr1]=0;break}delta=this$static._pos-curMatch;cyclicPos=(delta<=this$static._cyclicBufferPos?this$static._cyclicBufferPos-delta:this$static._cyclicBufferPos-delta+this$static._cyclicBufferSize)<<1;pby1=this$static._bufferOffset+curMatch;len=len0<(this$static._bufferBase[cur+len]&255)){this$static._son[ptr1]=curMatch;ptr1=cyclicPos+1;curMatch=this$static._son[ptr1];len1=len}else{this$static._son[ptr0]=curMatch;ptr0=cyclicPos;curMatch=this$static._son[ptr0];len0=len}}$MovePos_0(this$static)}while(--num!=0)}function getClass_39(){return Lorg_dellroad_lzma_client_SevenZip_Compression_LZ_BinTree_2_classLit}function BinTree(){}_=BinTree.prototype=new InWindow;_.getClass$=getClass_39;_.typeId$=0;_.HASH_ARRAY=true;_._cutValue=255;_._cyclicBufferPos=0;_._cyclicBufferSize=0;_._hash=null;_._hashMask=0;_._hashSizeSum=0;_._matchMaxLen=0;_._son=null;_.kFixHashSize=66560;_.kMinMatchCheck=4;_.kNumHashDirectBytes=0;var CrcTable;function $CopyBlock(this$static,distance,len){var pos;pos=this$static._pos-distance-1;if(pos<0){pos+=this$static._windowSize}for(;len!=0;--len){if(pos>=this$static._windowSize){pos=0}this$static._buffer[this$static._pos++]=this$static._buffer[pos++];if(this$static._pos>=this$static._windowSize){$Flush_0(this$static)}}}function $Create_5(this$static,windowSize){if(this$static._buffer==null||this$static._windowSize!=windowSize){this$static._buffer=initDim(_3B_classLit,0,-1,windowSize,1)}this$static._windowSize=windowSize;this$static._pos=0;this$static._streamPos=0}function $Flush_0(this$static){var size;size=this$static._pos-this$static._streamPos;if(size==0){return}$write_0(this$static._stream,this$static._buffer,this$static._streamPos,size);if(this$static._pos>=this$static._windowSize){this$static._pos=0}this$static._streamPos=this$static._pos}function $GetByte(this$static,distance){var pos;pos=this$static._pos-distance-1;if(pos<0){pos+=this$static._windowSize}return this$static._buffer[pos]}function $Init_7(this$static,solid){if(!solid){this$static._streamPos=0;this$static._pos=0}}function $PutByte(this$static,b){this$static._buffer[this$static._pos++]=b;if(this$static._pos>=this$static._windowSize){$Flush_0(this$static)}}function $ReleaseStream(this$static){$Flush_0(this$static);this$static._stream=null}function $SetStream_0(this$static,stream){$Flush_0(this$static);this$static._stream=null;this$static._stream=stream}function getClass_41(){return Lorg_dellroad_lzma_client_SevenZip_Compression_LZ_OutWindow_2_classLit}function OutWindow(){}_=OutWindow.prototype=new Object_0;_.getClass$=getClass_41;_.typeId$=0;_._buffer=null;_._pos=0;_._stream=null;_._streamPos=0;_._windowSize=0;function GetLenToPosState(len){len-=2;if(len<4){return len}return 3}function StateUpdateChar(index){if(index<4){return 0}if(index<10){return index-3}return index-6}function $Chunker_0(this$static,encoder){this$static.encoder=encoder;this$static.decoder=null;this$static.alive=true;return this$static}function $Chunker(this$static,decoder){this$static.decoder=decoder;this$static.encoder=null;this$static.alive=true;return this$static}function $processChunk(this$static){var exception;if(!this$static.alive){throw new IllegalStateException}exception=true;try{if(this$static.encoder){$processEncoderChunk(this$static)}else{$processDecoderChunk(this$static)}exception=false;return this$static.alive}finally{if(exception){this$static.alive=false}}}function $processDecoderChunk(this$static){var result;result=$CodeOneChunk(this$static.decoder);if(result==-1){throw $IOException(new IOException,"corrupted input")}this$static.inBytesProcessed=N1_longLit;this$static.outBytesProcessed=this$static.decoder.nowPos64;if(result==1||compare(this$static.decoder.outSize,P0_longLit)>=0&&compare(this$static.decoder.nowPos64,this$static.decoder.outSize)>=0){$CodeFinish(this$static.decoder);this$static.alive=false}}function $processEncoderChunk(this$static){$CodeOneBlock(this$static.encoder,this$static.encoder.processedInSize,this$static.encoder.processedOutSize,this$static.encoder.finished);this$static.inBytesProcessed=this$static.encoder.processedInSize[0];if(this$static.encoder.finished[0]){$ReleaseStreams(this$static.encoder);this$static.alive=false}}function getClass_28(){return Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Chunker_2_classLit}function Chunker(){}_=Chunker.prototype=new Object_0;_.getClass$=getClass_28;_.typeId$=0;_.alive=false;_.decoder=null;_.encoder=null;function $CodeFinish(this$static){$Flush_0(this$static.m_OutWindow);$ReleaseStream(this$static.m_OutWindow);this$static.m_RangeDecoder.Stream=null}function $CodeInChunks(this$static,inStream,outStream,outSize){this$static.m_RangeDecoder.Stream=inStream;$SetStream_0(this$static.m_OutWindow,outStream);$Init_1(this$static);this$static.state=0;this$static.rep0=0;this$static.rep1=0;this$static.rep2=0;this$static.rep3=0;this$static.outSize=outSize;this$static.nowPos64=P0_longLit;this$static.prevByte=0;return $Chunker(new Chunker,this$static)}function $CodeOneChunk(this$static){var decoder2,distance,len,numDirectBits,posSlot,posState;posState=lowBits_0(this$static.nowPos64)&this$static.m_PosStateMask;if($DecodeBit(this$static.m_RangeDecoder,this$static.m_IsMatchDecoders,(this$static.state<<4)+posState)==0){decoder2=$GetDecoder(this$static.m_LiteralDecoder,lowBits_0(this$static.nowPos64),this$static.prevByte);if(this$static.state<7){this$static.prevByte=$DecodeNormal(decoder2,this$static.m_RangeDecoder)}else{this$static.prevByte=$DecodeWithMatchByte(decoder2,this$static.m_RangeDecoder,$GetByte(this$static.m_OutWindow,this$static.rep0))}$PutByte(this$static.m_OutWindow,this$static.prevByte);this$static.state=StateUpdateChar(this$static.state);this$static.nowPos64=add(this$static.nowPos64,P1_longLit)}else{if($DecodeBit(this$static.m_RangeDecoder,this$static.m_IsRepDecoders,this$static.state)==1){len=0;if($DecodeBit(this$static.m_RangeDecoder,this$static.m_IsRepG0Decoders,this$static.state)==0){if($DecodeBit(this$static.m_RangeDecoder,this$static.m_IsRep0LongDecoders,(this$static.state<<4)+posState)==0){this$static.state=this$static.state<7?9:11;len=1}}else{if($DecodeBit(this$static.m_RangeDecoder,this$static.m_IsRepG1Decoders,this$static.state)==0){distance=this$static.rep1}else{if($DecodeBit(this$static.m_RangeDecoder,this$static.m_IsRepG2Decoders,this$static.state)==0){distance=this$static.rep2}else{distance=this$static.rep3;this$static.rep3=this$static.rep2}this$static.rep2=this$static.rep1}this$static.rep1=this$static.rep0;this$static.rep0=distance}if(len==0){len=$Decode(this$static.m_RepLenDecoder,this$static.m_RangeDecoder,posState)+2;this$static.state=this$static.state<7?8:11}}else{this$static.rep3=this$static.rep2;this$static.rep2=this$static.rep1;this$static.rep1=this$static.rep0;len=2+$Decode(this$static.m_LenDecoder,this$static.m_RangeDecoder,posState);this$static.state=this$static.state<7?7:10;posSlot=$Decode_0(this$static.m_PosSlotDecoder[GetLenToPosState(len)],this$static.m_RangeDecoder);if(posSlot>=4){numDirectBits=(posSlot>>1)-1;this$static.rep0=(2|posSlot&1)<<14){this$static.rep0+=ReverseDecode(this$static.m_PosDecoders,this$static.rep0-posSlot-1,this$static.m_RangeDecoder,numDirectBits)}else{this$static.rep0+=$DecodeDirectBits(this$static.m_RangeDecoder,numDirectBits-4)<<4;this$static.rep0+=$ReverseDecode(this$static.m_PosAlignDecoder,this$static.m_RangeDecoder);if(this$static.rep0<0){if(this$static.rep0==-1){return 1}return-1}}}else this$static.rep0=posSlot}if(compare(fromInt(this$static.rep0),this$static.nowPos64)>=0||this$static.rep0>=this$static.m_DictionarySizeCheck){return-1}$CopyBlock(this$static.m_OutWindow,this$static.rep0,len);this$static.nowPos64=add(this$static.nowPos64,fromInt(len));this$static.prevByte=$GetByte(this$static.m_OutWindow,0)}return 0}function $Decoder(this$static){var i;this$static.m_OutWindow=new OutWindow;this$static.m_RangeDecoder=new Decoder_0;this$static.m_IsMatchDecoders=initDim(_3S_classLit,0,-1,192,1);this$static.m_IsRepDecoders=initDim(_3S_classLit,0,-1,12,1);this$static.m_IsRepG0Decoders=initDim(_3S_classLit,0,-1,12,1);this$static.m_IsRepG1Decoders=initDim(_3S_classLit,0,-1,12,1);this$static.m_IsRepG2Decoders=initDim(_3S_classLit,0,-1,12,1);this$static.m_IsRep0LongDecoders=initDim(_3S_classLit,0,-1,192,1);this$static.m_PosSlotDecoder=initDim(_3Lorg_dellroad_lzma_client_SevenZip_Compression_RangeCoder_BitTreeDecoder_2_classLit,0,7,4,0);this$static.m_PosDecoders=initDim(_3S_classLit,0,-1,114,1);this$static.m_PosAlignDecoder=$BitTreeDecoder(new BitTreeDecoder,4);this$static.m_LenDecoder=$Decoder$LenDecoder(new Decoder$LenDecoder);this$static.m_RepLenDecoder=$Decoder$LenDecoder(new Decoder$LenDecoder);this$static.m_LiteralDecoder=new Decoder$LiteralDecoder;for(i=0;i<4;++i){this$static.m_PosSlotDecoder[i]=$BitTreeDecoder(new BitTreeDecoder,6)}return this$static}function $Init_1(this$static){var i;$Init_7(this$static.m_OutWindow,false);InitBitModels(this$static.m_IsMatchDecoders);InitBitModels(this$static.m_IsRep0LongDecoders);InitBitModels(this$static.m_IsRepDecoders);InitBitModels(this$static.m_IsRepG0Decoders);InitBitModels(this$static.m_IsRepG1Decoders);InitBitModels(this$static.m_IsRepG2Decoders);InitBitModels(this$static.m_PosDecoders);$Init_0(this$static.m_LiteralDecoder);for(i=0;i<4;++i){InitBitModels(this$static.m_PosSlotDecoder[i].Models)}$Init(this$static.m_LenDecoder);$Init(this$static.m_RepLenDecoder);InitBitModels(this$static.m_PosAlignDecoder.Models);$Init_8(this$static.m_RangeDecoder)}function $SetDecoderProperties(this$static,properties){var dictionarySize,i,lc,lp,pb,remainder,val;if(properties.length<5)return false;val=properties[0]&255;lc=val%9;remainder=~~(val/9);lp=remainder%5;pb=~~(remainder/5);dictionarySize=0;for(i=0;i<4;++i){dictionarySize+=(properties[1+i]&255)<<0){return false}if(this$static.m_DictionarySize!=dictionarySize){this$static.m_DictionarySize=dictionarySize;this$static.m_DictionarySizeCheck=max(this$static.m_DictionarySize,1);$Create_5(this$static.m_OutWindow,max(this$static.m_DictionarySizeCheck,4096))}return true}function $SetLcLpPb(this$static,lc,lp,pb){var numPosStates;if(lc>8||lp>4||pb>4){return false}$Create_0(this$static.m_LiteralDecoder,lp,lc);numPosStates=1<<>>8-this$static.m_NumPrevBits)]}function $Init_0(this$static){var i,numStates;numStates=1<<<24>>24}function $DecodeWithMatchByte(this$static,rangeDecoder,matchByte){var bit,matchBit,symbol;symbol=1;do{matchBit=matchByte>>7&1;matchByte<<=1;bit=$DecodeBit(rangeDecoder,this$static.m_Decoders,(1+matchBit<<8)+symbol);symbol=symbol<<1|bit;if(matchBit!=bit){while(symbol<256){symbol=symbol<<1|$DecodeBit(rangeDecoder,this$static.m_Decoders,symbol)}break}}while(symbol<256);return symbol<<24>>24}function $Decoder$LiteralDecoder$Decoder2(this$static){this$static.m_Decoders=initDim(_3S_classLit,0,-1,768,1);return this$static}function getClass_30(){return Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Decoder$LiteralDecoder$Decoder2_2_classLit}function Decoder$LiteralDecoder$Decoder2(){}_=Decoder$LiteralDecoder$Decoder2.prototype=new Object_0;_.getClass$=getClass_30;_.typeId$=17;function $clinit_59(){$clinit_59=nullMethod;var c,j,k,slotFast;g_FastPos=initDim(_3B_classLit,0,-1,2048,1);c=2;g_FastPos[0]=0;g_FastPos[1]=1;for(slotFast=2;slotFast<22;++slotFast){k=1<<(slotFast>>1)-1;for(j=0;j<<24>>24}}function $Backward(this$static,cur){var backCur,backMem,posMem,posPrev;this$static._optimumEndIndex=cur;posMem=this$static._optimum[cur].PosPrev;backMem=this$static._optimum[cur].BackPrev;do{if(this$static._optimum[cur].Prev1IsChar){$MakeAsChar(this$static._optimum[posMem]);this$static._optimum[posMem].PosPrev=posMem-1;if(this$static._optimum[cur].Prev2){this$static._optimum[posMem-1].Prev1IsChar=false;this$static._optimum[posMem-1].PosPrev=this$static._optimum[cur].PosPrev2;this$static._optimum[posMem-1].BackPrev=this$static._optimum[cur].BackPrev2}}posPrev=posMem;backCur=backMem;backMem=this$static._optimum[posPrev].BackPrev;posMem=this$static._optimum[posPrev].PosPrev;this$static._optimum[posPrev].BackPrev=backCur;this$static._optimum[posPrev].PosPrev=cur;cur=posPrev}while(cur>0);this$static.backRes=this$static._optimum[0].BackPrev;this$static._optimumCurrentIndex=this$static._optimum[0].PosPrev;return this$static._optimumCurrentIndex}function $BaseInit(this$static){var i;this$static._state=0;this$static._previousByte=0;for(i=0;i<4;++i){this$static._repDistances[i]=0}}function $CodeOneBlock(this$static,inSize,outSize,finished){var baseVal,complexState,curByte,distance,footerBits,i,len,lenToPosState,matchByte,pos,posReduced,posSlot,posState,progressPosValuePrev,subCoder;inSize[0]=P0_longLit;outSize[0]=P0_longLit;finished[0]=true;if(this$static._inStream){this$static._matchFinder._stream=this$static._inStream;$Init_5(this$static._matchFinder);this$static._needReleaseMFStream=true;this$static._inStream=null}if(this$static._finished){return}this$static._finished=true;progressPosValuePrev=this$static.nowPos64;if(eq(this$static.nowPos64,P0_longLit)){if($GetNumAvailableBytes(this$static._matchFinder)==0){$Flush(this$static,lowBits_0(this$static.nowPos64));return}$ReadMatchDistances(this$static);posState=lowBits_0(this$static.nowPos64)&this$static._posStateMask;$Encode_3(this$static._rangeEncoder,this$static._isMatch,(this$static._state<<4)+posState,0);this$static._state=StateUpdateChar(this$static._state);curByte=$GetIndexByte(this$static._matchFinder,-this$static._additionalOffset);$Encode_1($GetSubCoder(this$static._literalEncoder,lowBits_0(this$static.nowPos64),this$static._previousByte),this$static._rangeEncoder,curByte);this$static._previousByte=curByte;--this$static._additionalOffset;this$static.nowPos64=add(this$static.nowPos64,P1_longLit)}if($GetNumAvailableBytes(this$static._matchFinder)==0){$Flush(this$static,lowBits_0(this$static.nowPos64));return}while(true){len=$GetOptimum(this$static,lowBits_0(this$static.nowPos64));pos=this$static.backRes;posState=lowBits_0(this$static.nowPos64)&this$static._posStateMask;complexState=(this$static._state<<4)+posState;if(len==1&&pos==-1){$Encode_3(this$static._rangeEncoder,this$static._isMatch,complexState,0);curByte=$GetIndexByte(this$static._matchFinder,-this$static._additionalOffset);subCoder=$GetSubCoder(this$static._literalEncoder,lowBits_0(this$static.nowPos64),this$static._previousByte);if(this$static._state<7){$Encode_1(subCoder,this$static._rangeEncoder,curByte)}else{matchByte=$GetIndexByte(this$static._matchFinder,-this$static._repDistances[0]-1-this$static._additionalOffset);$EncodeMatched(subCoder,this$static._rangeEncoder,matchByte,curByte)}this$static._previousByte=curByte;this$static._state=StateUpdateChar(this$static._state)}else{$Encode_3(this$static._rangeEncoder,this$static._isMatch,complexState,1);if(pos<4){$Encode_3(this$static._rangeEncoder,this$static._isRep,this$static._state,1);if(pos==0){$Encode_3(this$static._rangeEncoder,this$static._isRepG0,this$static._state,0);if(len==1){$Encode_3(this$static._rangeEncoder,this$static._isRep0Long,complexState,0)}else{$Encode_3(this$static._rangeEncoder,this$static._isRep0Long,complexState,1)}}else{$Encode_3(this$static._rangeEncoder,this$static._isRepG0,this$static._state,1);if(pos==1){$Encode_3(this$static._rangeEncoder,this$static._isRepG1,this$static._state,0)}else{$Encode_3(this$static._rangeEncoder,this$static._isRepG1,this$static._state,1);$Encode_3(this$static._rangeEncoder,this$static._isRepG2,this$static._state,pos-2)}}if(len==1){this$static._state=this$static._state<7?9:11}else{$Encode_0(this$static._repMatchLenEncoder,this$static._rangeEncoder,len-2,posState);this$static._state=this$static._state<7?8:11}distance=this$static._repDistances[pos];if(pos!=0){for(i=pos;i>=1;--i){this$static._repDistances[i]=this$static._repDistances[i-1]}this$static._repDistances[0]=distance}}else{$Encode_3(this$static._rangeEncoder,this$static._isRep,this$static._state,0);this$static._state=this$static._state<7?7:10;$Encode_0(this$static._lenEncoder,this$static._rangeEncoder,len-2,posState);pos-=4;posSlot=GetPosSlot(pos);lenToPosState=GetLenToPosState(len);$Encode_2(this$static._posSlotEncoder[lenToPosState],this$static._rangeEncoder,posSlot);if(posSlot>=4){footerBits=(posSlot>>1)-1;baseVal=(2|posSlot&1)<<14){ReverseEncode(this$static._posEncoders,baseVal-posSlot-1,this$static._rangeEncoder,footerBits,posReduced)}else{$EncodeDirectBits(this$static._rangeEncoder,posReduced>>4,footerBits-4);$ReverseEncode(this$static._posAlignEncoder,this$static._rangeEncoder,posReduced&15);++this$static._alignPriceCount}}distance=pos;for(i=3;i>=1;--i){this$static._repDistances[i]=this$static._repDistances[i-1]}this$static._repDistances[0]=distance;++this$static._matchPriceCount}this$static._previousByte=$GetIndexByte(this$static._matchFinder,len-1-this$static._additionalOffset)}this$static._additionalOffset-=len;this$static.nowPos64=add(this$static.nowPos64,fromInt(len));if(this$static._additionalOffset==0){if(this$static._matchPriceCount>=128){$FillDistancesPrices(this$static)}if(this$static._alignPriceCount>=16){$FillAlignPrices(this$static)}inSize[0]=this$static.nowPos64;outSize[0]=$GetProcessedSizeAdd(this$static._rangeEncoder);if($GetNumAvailableBytes(this$static._matchFinder)==0){$Flush(this$static,lowBits_0(this$static.nowPos64));return}if(compare(sub(this$static.nowPos64,progressPosValuePrev),P1000_longLit)>=0){this$static._finished=false;finished[0]=false;return}}}}function $Create_2(this$static){var bt,numHashBytes;if(!this$static._matchFinder){bt=($clinit_60(),new BinTree);numHashBytes=4;if(this$static._matchFinderType==0){numHashBytes=2}$SetType(bt,numHashBytes);this$static._matchFinder=bt}$Create_1(this$static._literalEncoder,this$static._numLiteralPosStateBits,this$static._numLiteralContextBits);if(this$static._dictionarySize==this$static._dictionarySizePrev&&this$static._numFastBytesPrev==this$static._numFastBytes){return}$Create_3(this$static._matchFinder,this$static._dictionarySize,4096,this$static._numFastBytes,274);this$static._dictionarySizePrev=this$static._dictionarySize;this$static._numFastBytesPrev=this$static._numFastBytes}function $Encoder(this$static){var i;$clinit_59();this$static._repDistances=initDim(_3I_classLit,0,-1,4,1);this$static._optimum=initDim(_3Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Encoder$Optimal_2_classLit,0,6,4096,0);this$static._rangeEncoder=($clinit_66(),new Encoder_0);this$static._isMatch=initDim(_3S_classLit,0,-1,192,1);this$static._isRep=initDim(_3S_classLit,0,-1,12,1);this$static._isRepG0=initDim(_3S_classLit,0,-1,12,1);this$static._isRepG1=initDim(_3S_classLit,0,-1,12,1);this$static._isRepG2=initDim(_3S_classLit,0,-1,12,1);this$static._isRep0Long=initDim(_3S_classLit,0,-1,192,1);this$static._posSlotEncoder=initDim(_3Lorg_dellroad_lzma_client_SevenZip_Compression_RangeCoder_BitTreeEncoder_2_classLit,0,8,4,0);this$static._posEncoders=initDim(_3S_classLit,0,-1,114,1);this$static._posAlignEncoder=$BitTreeEncoder(new BitTreeEncoder,4);this$static._lenEncoder=$Encoder$LenPriceTableEncoder(new Encoder$LenPriceTableEncoder);this$static._repMatchLenEncoder=$Encoder$LenPriceTableEncoder(new Encoder$LenPriceTableEncoder);this$static._literalEncoder=new Encoder$LiteralEncoder;this$static._matchDistances=initDim(_3I_classLit,0,-1,548,1);this$static._posSlotPrices=initDim(_3I_classLit,0,-1,256,1);this$static._distancesPrices=initDim(_3I_classLit,0,-1,512,1);this$static._alignPrices=initDim(_3I_classLit,0,-1,16,1);this$static.reps=initDim(_3I_classLit,0,-1,4,1);this$static.repLens=initDim(_3I_classLit,0,-1,4,1);this$static.processedInSize=initDim(_3J_classLit,0,-1,1,3);this$static.processedOutSize=initDim(_3J_classLit,0,-1,1,3);this$static.finished=initDim(_3Z_classLit,0,-1,1,2);this$static.properties=initDim(_3B_classLit,0,-1,5,1);this$static.tempPrices=initDim(_3I_classLit,0,-1,128,1);for(i=0;i<4096;++i){this$static._optimum[i]=new Encoder$Optimal}for(i=0;i<4;++i){this$static._posSlotEncoder[i]=$BitTreeEncoder(new BitTreeEncoder,6)}return this$static}function $FillAlignPrices(this$static){var i;for(i=0;i<16;++i){this$static._alignPrices[i]=$ReverseGetPrice(this$static._posAlignEncoder,i)}this$static._alignPriceCount=0}function $FillDistancesPrices(this$static){var baseVal,encoder,footerBits,i,lenToPosState,posSlot,st,st2;for(i=4;i<128;++i){posSlot=GetPosSlot(i);footerBits=(posSlot>>1)-1;baseVal=(2|posSlot&1)<<4;++lenToPosState){encoder=this$static._posSlotEncoder[lenToPosState];st=lenToPosState<<6;for(posSlot=0;posSlot>1)-1-4<<6}st2=lenToPosState*128;for(i=0;i<4;++i){this$static._distancesPrices[st2+i]=this$static._posSlotPrices[st+i]}for(;i<128;++i){this$static._distancesPrices[st2+i]=this$static._posSlotPrices[st+GetPosSlot(i)]+this$static.tempPrices[i]}}this$static._matchPriceCount=0}function $Flush(this$static,nowPos){$ReleaseMFStream(this$static);$WriteEndMarker(this$static,nowPos&this$static._posStateMask);$FlushData(this$static._rangeEncoder)}function $GetOptimum(this$static,position){var cur,curAnd1Price,curAndLenCharPrice,curAndLenPrice,curBack,curPrice,currentByte,distance,i,len,lenEnd,lenMain,lenRes,lenTest,lenTest2,lenTestTemp,matchByte,matchPrice,newLen,nextIsChar,nextMatchPrice,nextOptimum,nextRepMatchPrice,normalMatchPrice,numAvailableBytes,numAvailableBytesFull,numDistancePairs,offs,offset,opt,optimum,pos,posPrev,posState,posStateNext,price_4,repIndex,repLen,repMatchPrice,repMaxIndex,shortRepPrice,startLen,state,state2,t,price,price_0,price_1,price_2,price_3;if(this$static._optimumEndIndex!=this$static._optimumCurrentIndex){lenRes=this$static._optimum[this$static._optimumCurrentIndex].PosPrev-this$static._optimumCurrentIndex;this$static.backRes=this$static._optimum[this$static._optimumCurrentIndex].BackPrev;this$static._optimumCurrentIndex=this$static._optimum[this$static._optimumCurrentIndex].PosPrev;return lenRes}this$static._optimumCurrentIndex=this$static._optimumEndIndex=0;if(this$static._longestMatchWasFound){lenMain=this$static._longestMatchLength;this$static._longestMatchWasFound=false}else{lenMain=$ReadMatchDistances(this$static)}numDistancePairs=this$static._numDistancePairs;numAvailableBytes=$GetNumAvailableBytes(this$static._matchFinder)+1;if(numAvailableBytes<2){this$static.backRes=-1;return 1}if(numAvailableBytes>273){numAvailableBytes=273}repMaxIndex=0;for(i=0;i<4;++i){this$static.reps[i]=this$static._repDistances[i];this$static.repLens[i]=$GetMatchLen(this$static._matchFinder,-1,this$static.reps[i],273);if(this$static.repLens[i]>this$static.repLens[repMaxIndex]){repMaxIndex=i}}if(this$static.repLens[repMaxIndex]>=this$static._numFastBytes){this$static.backRes=repMaxIndex;lenRes=this$static.repLens[repMaxIndex];$MovePos(this$static,lenRes-1);return lenRes}if(lenMain>=this$static._numFastBytes){this$static.backRes=this$static._matchDistances[numDistancePairs-1]+4;$MovePos(this$static,lenMain-1);return lenMain}currentByte=$GetIndexByte(this$static._matchFinder,-1);matchByte=$GetIndexByte(this$static._matchFinder,-this$static._repDistances[0]-1-1);if(lenMain<2&¤tByte!=matchByte&&this$static.repLens[repMaxIndex]<2){this$static.backRes=-1;return 1}this$static._optimum[0].State=this$static._state;posState=position&this$static._posStateMask;this$static._optimum[1].Price=($clinit_66(),ProbPrices[this$static._isMatch[(this$static._state<<4)+posState]>>>2])+$GetPrice_0($GetSubCoder(this$static._literalEncoder,position,this$static._previousByte),this$static._state>=7,matchByte,currentByte);$MakeAsChar(this$static._optimum[1]);matchPrice=ProbPrices[2048-this$static._isMatch[(this$static._state<<4)+posState]>>>2];repMatchPrice=matchPrice+ProbPrices[2048-this$static._isRep[this$static._state]>>>2];if(matchByte==currentByte){shortRepPrice=repMatchPrice+$GetRepLen1Price(this$static,this$static._state,posState);if(shortRepPrice=this$static.repLens[repMaxIndex]?lenMain:this$static.repLens[repMaxIndex];if(lenEnd<2){this$static.backRes=this$static._optimum[1].BackPrev;return 1}this$static._optimum[1].PosPrev=0;this$static._optimum[0].Backs0=this$static.reps[0];this$static._optimum[0].Backs1=this$static.reps[1];this$static._optimum[0].Backs2=this$static.reps[2];this$static._optimum[0].Backs3=this$static.reps[3];len=lenEnd;do{this$static._optimum[len--].Price=268435455}while(len>=2);for(i=0;i<4;++i){repLen=this$static.repLens[i];if(repLen<2){continue}price_4=repMatchPrice+$GetPureRepPrice(this$static,i,this$static._state,posState);do{curAndLenPrice=price_4+$GetPrice(this$static._repMatchLenEncoder,repLen-2,posState);optimum=this$static._optimum[repLen];if(curAndLenPrice=2)}normalMatchPrice=matchPrice+ProbPrices[this$static._isRep[this$static._state]>>>2];len=this$static.repLens[0]>=2?this$static.repLens[0]+1:2;if(len<=lenMain){offs=0;while(len>this$static._matchDistances[offs]){offs+=2}for(;;++len){distance=this$static._matchDistances[offs+1];curAndLenPrice=normalMatchPrice+$GetPosLenPrice(this$static,distance,len,posState);optimum=this$static._optimum[len];if(curAndLenPrice=this$static._numFastBytes){this$static._longestMatchLength=newLen;this$static._longestMatchWasFound=true;return $Backward(this$static,cur)}++position;posPrev=this$static._optimum[cur].PosPrev;if(this$static._optimum[cur].Prev1IsChar){--posPrev;if(this$static._optimum[cur].Prev2){state=this$static._optimum[this$static._optimum[cur].PosPrev2].State;if(this$static._optimum[cur].BackPrev2<4){state=state<7?8:11}else{state=state<7?7:10}}else{state=this$static._optimum[posPrev].State}state=StateUpdateChar(state)}else{state=this$static._optimum[posPrev].State}if(posPrev==cur-1){if(this$static._optimum[cur].BackPrev==0){state=state<7?9:11}else{state=StateUpdateChar(state)}}else{if(this$static._optimum[cur].Prev1IsChar&&this$static._optimum[cur].Prev2){posPrev=this$static._optimum[cur].PosPrev2;pos=this$static._optimum[cur].BackPrev2;state=state<7?8:11}else{pos=this$static._optimum[cur].BackPrev;if(pos<4){state=state<7?8:11}else{state=state<7?7:10}}opt=this$static._optimum[posPrev];if(pos<4){if(pos==0){this$static.reps[0]=opt.Backs0;this$static.reps[1]=opt.Backs1;this$static.reps[2]=opt.Backs2;this$static.reps[3]=opt.Backs3}else if(pos==1){this$static.reps[0]=opt.Backs1;this$static.reps[1]=opt.Backs0;this$static.reps[2]=opt.Backs2;this$static.reps[3]=opt.Backs3}else if(pos==2){this$static.reps[0]=opt.Backs2;this$static.reps[1]=opt.Backs0;this$static.reps[2]=opt.Backs1;this$static.reps[3]=opt.Backs3}else{this$static.reps[0]=opt.Backs3;this$static.reps[1]=opt.Backs0;this$static.reps[2]=opt.Backs1;this$static.reps[3]=opt.Backs2}}else{this$static.reps[0]=pos-4;this$static.reps[1]=opt.Backs0; -this$static.reps[2]=opt.Backs1;this$static.reps[3]=opt.Backs2}}this$static._optimum[cur].State=state;this$static._optimum[cur].Backs0=this$static.reps[0];this$static._optimum[cur].Backs1=this$static.reps[1];this$static._optimum[cur].Backs2=this$static.reps[2];this$static._optimum[cur].Backs3=this$static.reps[3];curPrice=this$static._optimum[cur].Price;currentByte=$GetIndexByte(this$static._matchFinder,-1);matchByte=$GetIndexByte(this$static._matchFinder,-this$static.reps[0]-1-1);posState=position&this$static._posStateMask;curAnd1Price=curPrice+ProbPrices[this$static._isMatch[(state<<4)+posState]>>>2]+$GetPrice_0($GetSubCoder(this$static._literalEncoder,position,$GetIndexByte(this$static._matchFinder,-2)),state>=7,matchByte,currentByte);nextOptimum=this$static._optimum[cur+1];nextIsChar=false;if(curAnd1Price<<4)+posState]>>>2];repMatchPrice=matchPrice+ProbPrices[2048-this$static._isRep[state]>>>2];if(matchByte==currentByte&&!(nextOptimum.PosPrev>>2]+ProbPrices[this$static._isRep0Long[(state<<4)+posState]>>>2]);if(shortRepPrice<=nextOptimum.Price){nextOptimum.Price=shortRepPrice;nextOptimum.PosPrev=cur;nextOptimum.BackPrev=0;nextOptimum.Prev1IsChar=false;nextIsChar=true}}numAvailableBytesFull=$GetNumAvailableBytes(this$static._matchFinder)+1;numAvailableBytesFull=4095-cur<2){continue}if(numAvailableBytes>this$static._numFastBytes){numAvailableBytes=this$static._numFastBytes}if(!nextIsChar&&matchByte!=currentByte){t=min(numAvailableBytesFull-1,this$static._numFastBytes);lenTest2=$GetMatchLen(this$static._matchFinder,0,this$static.reps[0],t);if(lenTest2>=2){state2=StateUpdateChar(state);posStateNext=position+1&this$static._posStateMask;nextRepMatchPrice=curAnd1Price+ProbPrices[2048-this$static._isMatch[(state2<<4)+posStateNext]>>>2]+ProbPrices[2048-this$static._isRep[state2]>>>2];offset=cur+1+lenTest2;while(lenEnd<4;++repIndex){lenTest=$GetMatchLen(this$static._matchFinder,-1,this$static.reps[repIndex],numAvailableBytes);if(lenTest<2){continue}lenTestTemp=lenTest;do{while(lenEnd=2);lenTest=lenTestTemp;if(repIndex==0){startLen=lenTest+1}if(lenTest=2){state2=state<7?8:11;posStateNext=position+lenTest&this$static._posStateMask;curAndLenCharPrice=repMatchPrice+(price_1=$GetPrice(this$static._repMatchLenEncoder,lenTest-2,posState),price_1+$GetPureRepPrice(this$static,repIndex,state,posState))+ProbPrices[this$static._isMatch[(state2<<4)+posStateNext]>>>2]+$GetPrice_0($GetSubCoder(this$static._literalEncoder,position+lenTest,$GetIndexByte(this$static._matchFinder,lenTest-1-1)),true,$GetIndexByte(this$static._matchFinder,lenTest-1-(this$static.reps[repIndex]+1)),$GetIndexByte(this$static._matchFinder,lenTest-1));state2=StateUpdateChar(state2);posStateNext=position+lenTest+1&this$static._posStateMask;nextMatchPrice=curAndLenCharPrice+ProbPrices[2048-this$static._isMatch[(state2<<4)+posStateNext]>>>2];nextRepMatchPrice=nextMatchPrice+ProbPrices[2048-this$static._isRep[state2]>>>2];offset=lenTest+1+lenTest2;while(lenEndnumAvailableBytes){newLen=numAvailableBytes;for(numDistancePairs=0;newLen>this$static._matchDistances[numDistancePairs];numDistancePairs+=2){}this$static._matchDistances[numDistancePairs]=newLen;numDistancePairs+=2}if(newLen>=startLen){normalMatchPrice=matchPrice+ProbPrices[this$static._isRep[state]>>>2];while(lenEndthis$static._matchDistances[offs]){offs+=2}for(lenTest=startLen;;++lenTest){curBack=this$static._matchDistances[offs+1];curAndLenPrice=normalMatchPrice+$GetPosLenPrice(this$static,curBack,lenTest,posState);optimum=this$static._optimum[cur+lenTest];if(curAndLenPrice=2){state2=state<7?7:10;posStateNext=position+lenTest&this$static._posStateMask;curAndLenCharPrice=curAndLenPrice+ProbPrices[this$static._isMatch[(state2<<4)+posStateNext]>>>2]+$GetPrice_0($GetSubCoder(this$static._literalEncoder,position+lenTest,$GetIndexByte(this$static._matchFinder,lenTest-1-1)),true,$GetIndexByte(this$static._matchFinder,lenTest-(curBack+1)-1),$GetIndexByte(this$static._matchFinder,lenTest-1));state2=StateUpdateChar(state2);posStateNext=position+lenTest+1&this$static._posStateMask;nextMatchPrice=curAndLenCharPrice+ProbPrices[2048-this$static._isMatch[(state2<<4)+posStateNext]>>>2];nextRepMatchPrice=nextMatchPrice+ProbPrices[2048-this$static._isRep[state2]>>>2];offset=lenTest+1+lenTest2;while(lenEnd>>2]);price+=ProbPrices[2048-this$static._isRep0Long[(state<<4)+posState]>>>2]}else{price=($clinit_66(),ProbPrices[2048-this$static._isRepG0[state]>>>2]);if(repIndex==1){price+=ProbPrices[this$static._isRepG1[state]>>>2]}else{price+=ProbPrices[2048-this$static._isRepG1[state]>>>2];price+=GetPrice(this$static._isRepG2[state],repIndex-2)}}return price}function $GetRepLen1Price(this$static,state,posState){return($clinit_66(),ProbPrices[this$static._isRepG0[state]>>>2])+ProbPrices[this$static._isRep0Long[(state<<4)+posState]>>>2]}function $Init_4(this$static){var i;$BaseInit(this$static);$Init_9(this$static._rangeEncoder);InitBitModels_0(this$static._isMatch);InitBitModels_0(this$static._isRep0Long);InitBitModels_0(this$static._isRep);InitBitModels_0(this$static._isRepG0);InitBitModels_0(this$static._isRepG1);InitBitModels_0(this$static._isRepG2);InitBitModels_0(this$static._posEncoders);$Init_3(this$static._literalEncoder);for(i=0;i<4;++i){InitBitModels(this$static._posSlotEncoder[i].Models)}$Init_2(this$static._lenEncoder,1<<0){$Skip(this$static._matchFinder,num);this$static._additionalOffset+=num}}function $ReadMatchDistances(this$static){var lenRes;lenRes=0;this$static._numDistancePairs=$GetMatches(this$static._matchFinder,this$static._matchDistances);if(this$static._numDistancePairs>0){lenRes=this$static._matchDistances[this$static._numDistancePairs-2];if(lenRes==this$static._numFastBytes)lenRes+=$GetMatchLen(this$static._matchFinder,lenRes-1,this$static._matchDistances[this$static._numDistancePairs-1],273-lenRes)}++this$static._additionalOffset;return lenRes}function $ReleaseMFStream(this$static){if(!!this$static._matchFinder&&this$static._needReleaseMFStream){this$static._matchFinder._stream=null;this$static._needReleaseMFStream=false}}function $ReleaseStreams(this$static){$ReleaseMFStream(this$static);this$static._rangeEncoder.Stream=null}function $SetDictionarySize_0(this$static,dictionarySize){var dicLogSize;if(dictionarySize<1||dictionarySize>536870912){return false}this$static._dictionarySize=dictionarySize;for(dicLogSize=0;dictionarySize>1<<0||lp>4||lc<0||lc>8||pb<0||pb>4){return false}this$static._numLiteralPosStateBits=lp;this$static._numLiteralContextBits=lc;this$static._posStateBits=pb;this$static._posStateMask=(1<<0||matchFinderIndex>2){return false}matchFinderIndexPrev=this$static._matchFinderType;this$static._matchFinderType=matchFinderIndex;if(!!this$static._matchFinder&&matchFinderIndexPrev!=this$static._matchFinderType){this$static._dictionarySizePrev=-1;this$static._matchFinder=null}return true}function $SetNumFastBytes(this$static,numFastBytes){if(numFastBytes<5||numFastBytes>273){return false}this$static._numFastBytes=numFastBytes;return true}function $WriteCoderProperties(this$static,outStream){var i;this$static.properties[0]=(this$static._posStateBits*5+this$static._numLiteralPosStateBits)*9+this$static._numLiteralContextBits<<24>>24;for(i=0;i<4;++i){this$static.properties[1+i]=this$static._dictionarySize>>8*i<<24>>24}$write_0(outStream,this$static.properties,0,5)}function $WriteEndMarker(this$static,posState){var lenToPosState;if(!this$static._writeEndMark){return}$Encode_3(this$static._rangeEncoder,this$static._isMatch,(this$static._state<<4)+posState,1);$Encode_3(this$static._rangeEncoder,this$static._isRep,this$static._state,0);this$static._state=this$static._state<7?7:10;$Encode_0(this$static._lenEncoder,this$static._rangeEncoder,0,posState);lenToPosState=GetLenToPosState(2);$Encode_2(this$static._posSlotEncoder[lenToPosState],this$static._rangeEncoder,63);$EncodeDirectBits(this$static._rangeEncoder,67108863,26);$ReverseEncode(this$static._posAlignEncoder,this$static._rangeEncoder,15)}function GetPosSlot(pos){if(pos<2048){return g_FastPos[pos]}if(pos<2097152){return g_FastPos[pos>>10]+20}return g_FastPos[pos>>20]+40}function GetPosSlot2(pos){if(pos<131072){return g_FastPos[pos>>6]+12}if(pos<134217728){return g_FastPos[pos>>16]+32}return g_FastPos[pos>>26]+52}function getClass_38(){return Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Encoder_2_classLit}function Encoder(){}_=Encoder.prototype=new Object_0;_.getClass$=getClass_38;_.typeId$=0;_._additionalOffset=0;_._alignPriceCount=0;_._dictionarySize=4194304;_._dictionarySizePrev=-1;_._distTableSize=44;_._finished=false;_._inStream=null;_._longestMatchLength=0;_._longestMatchWasFound=false;_._matchFinder=null;_._matchFinderType=1;_._matchPriceCount=0;_._needReleaseMFStream=false;_._numDistancePairs=0;_._numFastBytes=32;_._numFastBytesPrev=-1;_._numLiteralContextBits=3;_._numLiteralPosStateBits=0;_._optimumCurrentIndex=0;_._optimumEndIndex=0;_._posStateBits=2;_._posStateMask=3;_._previousByte=0;_._state=0;_._writeEndMark=false;_.backRes=0;_.nowPos64=P0_longLit;var g_FastPos;function $Encode(this$static,rangeEncoder,symbol,posState){if(symbol<8){$Encode_3(rangeEncoder,this$static._choice,0,0);$Encode_2(this$static._lowCoder[posState],rangeEncoder,symbol)}else{symbol-=8;$Encode_3(rangeEncoder,this$static._choice,0,1);if(symbol<8){$Encode_3(rangeEncoder,this$static._choice,1,0);$Encode_2(this$static._midCoder[posState],rangeEncoder,symbol)}else{$Encode_3(rangeEncoder,this$static._choice,1,1);$Encode_2(this$static._highCoder,rangeEncoder,symbol-8)}}}function $Encoder$LenEncoder(this$static){var posState;this$static._choice=initDim(_3S_classLit,0,-1,2,1);this$static._lowCoder=initDim(_3Lorg_dellroad_lzma_client_SevenZip_Compression_RangeCoder_BitTreeEncoder_2_classLit,0,8,16,0);this$static._midCoder=initDim(_3Lorg_dellroad_lzma_client_SevenZip_Compression_RangeCoder_BitTreeEncoder_2_classLit,0,8,16,0);this$static._highCoder=$BitTreeEncoder(new BitTreeEncoder,8);for(posState=0;posState<16;++posState){this$static._lowCoder[posState]=$BitTreeEncoder(new BitTreeEncoder,3);this$static._midCoder[posState]=$BitTreeEncoder(new BitTreeEncoder,3)}return this$static}function $Init_2(this$static,numPosStates){var posState;InitBitModels_0(this$static._choice);for(posState=0;posState>>2]);a1=ProbPrices[2048-this$static._choice[0]>>>2];b0=a1+ProbPrices[this$static._choice[1]>>>2];b1=a1+ProbPrices[2048-this$static._choice[1]>>>2];i=0;for(i=0;i<8;++i){if(i>=numSymbols)return;prices[st+i]=a0+$GetPrice_1(this$static._lowCoder[posState],i)}for(;i<16;++i){if(i>=numSymbols)return;prices[st+i]=b0+$GetPrice_1(this$static._midCoder[posState],i-8)}for(;i<>>8-this$static.m_NumPrevBits)]}function $Init_3(this$static){var i,numStates;numStates=1<=0;--i){bit=symbol>>i&1;$Encode_3(rangeEncoder,this$static.m_Encoders,context,bit);context=context<<1|bit}}function $EncodeMatched(this$static,rangeEncoder,matchByte,symbol){var bit,context,i,matchBit,same,state;context=1;same=true;for(i=7;i>=0;--i){bit=symbol>>i&1;state=context;if(same){matchBit=matchByte>>i&1;state+=1+matchBit<<8;same=matchBit==bit}$Encode_3(rangeEncoder,this$static.m_Encoders,state,bit);context=context<<1|bit}}function $Encoder$LiteralEncoder$Encoder2(this$static){this$static.m_Encoders=initDim(_3S_classLit,0,-1,768,1);return this$static}function $GetPrice_0(this$static,matchMode,matchByte,symbol){var bit,context,i,matchBit,price;price=0;context=1;i=7;if(matchMode){for(;i>=0;--i){matchBit=matchByte>>i&1;bit=symbol>>i&1;price+=GetPrice(this$static.m_Encoders[(1+matchBit<<8)+context],bit);context=context<<1|bit;if(matchBit!=bit){--i;break}}}for(;i>=0;--i){bit=symbol>>i&1;price+=GetPrice(this$static.m_Encoders[context],bit);context=context<<1|bit}return price}function getClass_35(){return Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Encoder$LiteralEncoder$Encoder2_2_classLit}function Encoder$LiteralEncoder$Encoder2(){}_=Encoder$LiteralEncoder$Encoder2.prototype=new Object_0;_.getClass$=getClass_35;_.typeId$=18;function $MakeAsChar(this$static){this$static.BackPrev=-1;this$static.Prev1IsChar=false}function $MakeAsShortRep(this$static){this$static.BackPrev=0;this$static.Prev1IsChar=false}function getClass_37(){return Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Encoder$Optimal_2_classLit}function Encoder$Optimal(){}_=Encoder$Optimal.prototype=new Object_0;_.getClass$=getClass_37;_.typeId$=19;_.BackPrev=0;_.BackPrev2=0;_.Backs0=0;_.Backs1=0;_.Backs2=0;_.Backs3=0;_.PosPrev=0;_.PosPrev2=0;_.Prev1IsChar=false;_.Prev2=false;_.Price=0;_.State=0;function $BitTreeDecoder(this$static,numBitLevels){this$static.NumBitLevels=numBitLevels;this$static.Models=initDim(_3S_classLit,0,-1,1<<>>bitIndex&1;$Encode_3(rangeEncoder,this$static.Models,m,bit);m=m<<1|bit}}function $GetPrice_1(this$static,symbol){var bit,bitIndex,m,price;price=0;m=1;for(bitIndex=this$static.NumBitLevels;bitIndex!=0;){--bitIndex;bit=symbol>>>bitIndex&1;price+=GetPrice(this$static.Models[m],bit);m=(m<<1)+bit}return price}function $ReverseEncode(this$static,rangeEncoder,symbol){var bit,i,m;m=1;for(i=0;i<<1|bit;symbol>>=1}}function $ReverseGetPrice(this$static,symbol){var bit,i,m,price;price=0;m=1;for(i=this$static.NumBitLevels;i!=0;--i){bit=symbol&1;symbol>>>=1;price+=GetPrice(this$static.Models[m],bit);m=m<<1|bit}return price}function ReverseEncode(Models,startIndex,rangeEncoder,NumBitLevels,symbol){var bit,i,m;m=1;for(i=0;i<<1|bit;symbol>>=1}}function ReverseGetPrice(Models,startIndex,NumBitLevels,symbol){var bit,i,m,price;price=0;m=1;for(i=NumBitLevels;i!=0;--i){bit=symbol&1;symbol>>>=1;price+=($clinit_66(),ProbPrices[((Models[startIndex+m]-bit^-bit)&2047)>>>2]);m=m<<1|bit}return price}function getClass_43(){return Lorg_dellroad_lzma_client_SevenZip_Compression_RangeCoder_BitTreeEncoder_2_classLit}function BitTreeEncoder(){}_=BitTreeEncoder.prototype=new Object_0;_.getClass$=getClass_43;_.typeId$=21;_.Models=null;_.NumBitLevels=0;function $DecodeBit(this$static,probs,index){var newBound,prob;prob=probs[index];newBound=(this$static.Range>>>11)*prob;if((this$static.Code^-2147483648)<(newBound^-2147483648)){this$static.Range=newBound;probs[index]=prob+(2048-prob>>>5)<<16>>16;if((this$static.Range&-16777216)==0){this$static.Code=this$static.Code<<8|$read(this$static.Stream);this$static.Range<<=8}return 0}else{this$static.Range-=newBound;this$static.Code-=newBound;probs[index]=prob-(prob>>>5)<<16>>16;if((this$static.Range&-16777216)==0){this$static.Code=this$static.Code<<8|$read(this$static.Stream);this$static.Range<<=8}return 1}}function $DecodeDirectBits(this$static,numTotalBits){var i,result,t;result=0;for(i=numTotalBits;i!=0;--i){this$static.Range>>>=1;t=this$static.Code-this$static.Range>>>31;this$static.Code-=this$static.Range&t-1;result=result<<1|1-t;if((this$static.Range&-16777216)==0){this$static.Code=this$static.Code<<8|$read(this$static.Stream);this$static.Range<<=8}}return result}function $Init_8(this$static){var i;this$static.Code=0;this$static.Range=-1;for(i=0;i<5;++i){this$static.Code=this$static.Code<<8|$read(this$static.Stream)}}function InitBitModels(probs){var i;for(i=0;i=0;--i){start=1<<9-i-1;end=1<<9-i;for(j=start;j<<6)+(end-j<<6>>>9-i-1)}}}function $Encode_3(this$static,probs,index,symbol){var newBound,prob;prob=probs[index];newBound=(this$static.Range>>>11)*prob;if(symbol==0){this$static.Range=newBound;probs[index]=prob+(2048-prob>>>5)<<16>>16}else{this$static.Low=add(this$static.Low,and(fromInt(newBound),Pffffffff_longLit));this$static.Range-=newBound;probs[index]=prob-(prob>>>5)<<16>>16}if((this$static.Range&-16777216)==0){this$static.Range<<=8;$ShiftLow(this$static)}}function $EncodeDirectBits(this$static,v,numTotalBits){var i;for(i=numTotalBits-1;i>=0;--i){this$static.Range>>>=1;if((v>>>i&1)==1){this$static.Low=add(this$static.Low,fromInt(this$static.Range))}if((this$static.Range&-16777216)==0){this$static.Range<<=8;$ShiftLow(this$static)}}}function $FlushData(this$static){var i;for(i=0;i<5;++i){$ShiftLow(this$static)}}function $GetProcessedSizeAdd(this$static){return add(add(fromInt(this$static._cacheSize),this$static._position),P4_longLit)}function $Init_9(this$static){this$static._position=P0_longLit;this$static.Low=P0_longLit;this$static.Range=-1;this$static._cacheSize=1;this$static._cache=0}function $ShiftLow(this$static){var LowHi,temp;LowHi=lowBits_0(shru(this$static.Low,32));if(LowHi!=0||compare(this$static.Low,Pff000000_longLit)<0){this$static._position=add(this$static._position,fromInt(this$static._cacheSize));temp=this$static._cache;do{$write(this$static.Stream,temp+LowHi);temp=255}while(--this$static._cacheSize!=0);this$static._cache=lowBits_0(this$static.Low)>>>24}++this$static._cacheSize;this$static.Low=shl(and(this$static.Low,Pffffff_longLit),8)}function GetPrice(Prob,symbol){$clinit_66();return ProbPrices[((Prob-symbol^-symbol)&2047)>>>2]}function InitBitModels_0(probs){$clinit_66();var i;for(i=0;i=utf.length){throw $IllegalArgumentException(new IllegalArgumentException,"invalid UTF-8")}y=utf[++i]&255;if((y&192)!=128){throw $IllegalArgumentException(new IllegalArgumentException,"invalid UTF-8")}$append(buf.data,String.fromCharCode((x&31)<<6&65535|y&63))}else if((x&240)==224){if(i+2>=utf.length){throw $IllegalArgumentException(new IllegalArgumentException,"invalid UTF-8")}y=utf[++i]&255;if((y&192)!=128){throw $IllegalArgumentException(new IllegalArgumentException,"invalid UTF-8")}z=utf[++i]&255;if((z&192)!=128){throw $IllegalArgumentException(new IllegalArgumentException,"invalid UTF-8")}$appendNonNull(buf.data,String.fromCharCode(((x&15)<<12|(y&63)<<6|z&63)&65535))}else{throw $IllegalArgumentException(new IllegalArgumentException,"invalid UTF-8")}}return $toString(buf.data)}function encode(s){var ch,chars,data,elen,i,charArr,n;chars=(n=s.length,charArr=initDim(_3C_classLit,0,-1,n,1),$getChars(s,0,n,charArr,0),charArr);elen=0;for(i=0;i=1&&ch<=127){++elen}else if(ch==0||ch>=128&&ch<=2047){elen+=2}else{elen+=3}}data=initDim(_3B_classLit,0,-1,elen,1);elen=0;for(i=0;i=1&&ch<=127){data[elen++]=ch<<24>>24}else if(ch==0||ch>=128&&ch<=2047){data[elen++]=(192|ch>>6&31)<<24>>24;data[elen++]=(128|ch&63)<<24>>24}else{data[elen++]=(224|ch>>12&15)<<24>>24;data[elen++]=(128|ch>>6&63)<<24>>24;data[elen++]=(128|ch&63)<<24>>24}}return data}function $LZMADemo(this$static){return this$static}function toDouble(a){return a[1]+a[0]}function compress(str,mode,callback_num){var this$static=$LZMADemo(new LZMADemo),percent,start;this$static.mode=get_mode_obj(mode);this$static.c=$LZMAByteArrayCompressor(new LZMAByteArrayCompressor,encode(str),this$static.mode);update_progress(0,callback_num);function do_action(){start=(new Date).getTime();while($execute(this$static.c)){percent=toDouble(this$static.c.chunker.inBytesProcessed)/toDouble(this$static.c.length_0);if((new Date).getTime()-start>200){update_progress(percent,callback_num);setTimeout(do_action,0);return false}}update_progress(1,callback_num);postMessage({action:action_compress,callback_num:callback_num,result:$toByteArray(this$static.c.output).slice(0)})}setTimeout(do_action,1)}function decompress(byte_arr,callback_num){var this$static=$LZMADemo(new LZMADemo),percent,data=initValues(_3B_classLit,0,-1,byte_arr),start,text;this$static.d=$LZMAByteArrayDecompressor(new LZMAByteArrayDecompressor,data);update_progress(0,callback_num);function do_action(){start=(new Date).getTime();while($execute_0(this$static.d)){percent=toDouble(this$static.d.chunker.decoder.nowPos64)/toDouble(this$static.d.length_0);if((new Date).getTime()-start>200){update_progress(percent,callback_num);setTimeout(do_action,0);return false}}update_progress(1,callback_num);postMessage({action:action_decompress,callback_num:callback_num,result:decode($toByteArray(this$static.d.output))})}setTimeout(do_action,0)}function $onModuleLoad(this$static){compress(this$static);decompress(this$static)}function getClass_46(){return Lorg_dellroad_lzma_demo_client_LZMADemo_2_classLit}function LZMADemo(){}_=LZMADemo.prototype=new Object_0;_.getClass$=getClass_46;_.typeId$=0;_.c=null;_.d=null;var DEFAULT_COMPRESSION_MODE;function init(){!!$stats&&$stats({moduleName:$moduleName,subSystem:"startup",evtGroup:"moduleStartup",millis:(new Date).getTime(),type:"onModuleLoadStart",className:"org.dellroad.lzma.demo.client.LZMADemo"})}function gwtOnLoad(errFn,modName,modBase){$moduleName=modName;$moduleBase=modBase;if(errFn){try{init()}catch(e){errFn(modName)}}else{init()}}function nullMethod(){}var Ljava_lang_Object_2_classLit=createForClass("java.lang.","Object"),Ljava_lang_Throwable_2_classLit=createForClass("java.lang.","Throwable"),Ljava_lang_Exception_2_classLit=createForClass("java.lang.","Exception"),Ljava_lang_RuntimeException_2_classLit=createForClass("java.lang.","RuntimeException"),Lcom_google_gwt_core_client_JavaScriptException_2_classLit=createForClass("com.google.gwt.core.client.","JavaScriptException"),Lcom_google_gwt_core_client_JavaScriptObject_2_classLit=createForClass("com.google.gwt.core.client.","JavaScriptObject$"),_3_3D_classLit=createForArray("","[[D"),Ljava_io_InputStream_2_classLit=createForClass("java.io.","InputStream"),Ljava_io_ByteArrayInputStream_2_classLit=createForClass("java.io.","ByteArrayInputStream"),_3B_classLit=createForArray("","[B"),Ljava_io_OutputStream_2_classLit=createForClass("java.io.","OutputStream"),Ljava_io_ByteArrayOutputStream_2_classLit=createForClass("java.io.","ByteArrayOutputStream"),Ljava_io_IOException_2_classLit=createForClass("java.io.","IOException"),Ljava_lang_Enum_2_classLit=createForClass("java.lang.","Enum"),Ljava_lang_ArithmeticException_2_classLit=createForClass("java.lang.","ArithmeticException"),Ljava_lang_ArrayStoreException_2_classLit=createForClass("java.lang.","ArrayStoreException"),_3C_classLit=createForArray("","[C"),Ljava_lang_Class_2_classLit=createForClass("java.lang.","Class"),Ljava_lang_ClassCastException_2_classLit=createForClass("java.lang.","ClassCastException"),Ljava_lang_IllegalArgumentException_2_classLit=createForClass("java.lang.","IllegalArgumentException"),Ljava_lang_IllegalStateException_2_classLit=createForClass("java.lang.","IllegalStateException"),Ljava_lang_IndexOutOfBoundsException_2_classLit=createForClass("java.lang.","IndexOutOfBoundsException"),_3I_classLit=createForArray("","[I"),Ljava_lang_NullPointerException_2_classLit=createForClass("java.lang.","NullPointerException"),Ljava_lang_String_2_classLit=createForClass("java.lang.","String"),Ljava_lang_StringBuilder_2_classLit=createForClass("java.lang.","StringBuilder"),Lorg_dellroad_lzma_client_SevenZip_Compression_LZ_InWindow_2_classLit=createForClass("org.dellroad.lzma.client.SevenZip.Compression.LZ.","InWindow"),Lorg_dellroad_lzma_client_SevenZip_Compression_LZ_BinTree_2_classLit=createForClass("org.dellroad.lzma.client.SevenZip.Compression.LZ.","BinTree"),Lorg_dellroad_lzma_client_SevenZip_Compression_LZ_OutWindow_2_classLit=createForClass("org.dellroad.lzma.client.SevenZip.Compression.LZ.","OutWindow"),Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Chunker_2_classLit=createForClass("org.dellroad.lzma.client.SevenZip.Compression.LZMA.","Chunker"),_3S_classLit=createForArray("","[S"),_3Lorg_dellroad_lzma_client_SevenZip_Compression_RangeCoder_BitTreeDecoder_2_classLit=createForArray("[Lorg.dellroad.lzma.client.SevenZip.Compression.RangeCoder.","BitTreeDecoder;"),Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Decoder_2_classLit=createForClass("org.dellroad.lzma.client.SevenZip.Compression.LZMA.","Decoder"),Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Decoder$LenDecoder_2_classLit=createForClass("org.dellroad.lzma.client.SevenZip.Compression.LZMA.","Decoder$LenDecoder"),_3Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Decoder$LiteralDecoder$Decoder2_2_classLit=createForArray("[Lorg.dellroad.lzma.client.SevenZip.Compression.LZMA.","Decoder$LiteralDecoder$Decoder2;"),Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Decoder$LiteralDecoder_2_classLit=createForClass("org.dellroad.lzma.client.SevenZip.Compression.LZMA.","Decoder$LiteralDecoder"),Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Decoder$LiteralDecoder$Decoder2_2_classLit=createForClass("org.dellroad.lzma.client.SevenZip.Compression.LZMA.","Decoder$LiteralDecoder$Decoder2"),_3Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Encoder$Optimal_2_classLit=createForArray("[Lorg.dellroad.lzma.client.SevenZip.Compression.LZMA.","Encoder$Optimal;"),_3Lorg_dellroad_lzma_client_SevenZip_Compression_RangeCoder_BitTreeEncoder_2_classLit=createForArray("[Lorg.dellroad.lzma.client.SevenZip.Compression.RangeCoder.","BitTreeEncoder;"),_3J_classLit=createForArray("","[J"),_3Z_classLit=createForArray("","[Z"),Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Encoder_2_classLit=createForClass("org.dellroad.lzma.client.SevenZip.Compression.LZMA.","Encoder"),_3Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Encoder$LiteralEncoder$Encoder2_2_classLit=createForArray("[Lorg.dellroad.lzma.client.SevenZip.Compression.LZMA.","Encoder$LiteralEncoder$Encoder2;"),Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Encoder$LiteralEncoder_2_classLit=createForClass("org.dellroad.lzma.client.SevenZip.Compression.LZMA.","Encoder$LiteralEncoder"),Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Encoder$LiteralEncoder$Encoder2_2_classLit=createForClass("org.dellroad.lzma.client.SevenZip.Compression.LZMA.","Encoder$LiteralEncoder$Encoder2"),Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Encoder$LenEncoder_2_classLit=createForClass("org.dellroad.lzma.client.SevenZip.Compression.LZMA.","Encoder$LenEncoder"),Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Encoder$LenPriceTableEncoder_2_classLit=createForClass("org.dellroad.lzma.client.SevenZip.Compression.LZMA.","Encoder$LenPriceTableEncoder"),Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Encoder$Optimal_2_classLit=createForClass("org.dellroad.lzma.client.SevenZip.Compression.LZMA.","Encoder$Optimal"),Lorg_dellroad_lzma_client_SevenZip_Compression_RangeCoder_BitTreeDecoder_2_classLit=createForClass("org.dellroad.lzma.client.SevenZip.Compression.RangeCoder.","BitTreeDecoder"),Lorg_dellroad_lzma_client_SevenZip_Compression_RangeCoder_BitTreeEncoder_2_classLit=createForClass("org.dellroad.lzma.client.SevenZip.Compression.RangeCoder.","BitTreeEncoder"),Lorg_dellroad_lzma_client_SevenZip_Compression_RangeCoder_Decoder_2_classLit=createForClass("org.dellroad.lzma.client.SevenZip.Compression.RangeCoder.","Decoder"),Lorg_dellroad_lzma_client_SevenZip_Compression_RangeCoder_Encoder_2_classLit=createForClass("org.dellroad.lzma.client.SevenZip.Compression.RangeCoder.","Encoder"),Lorg_dellroad_lzma_client_CompressionMode_2_classLit=createForEnum("org.dellroad.lzma.client.","CompressionMode"),Lorg_dellroad_lzma_client_LZMACompressor_2_classLit=createForClass("org.dellroad.lzma.client.","LZMACompressor"),Lorg_dellroad_lzma_client_LZMAByteArrayCompressor_2_classLit=createForClass("org.dellroad.lzma.client.","LZMAByteArrayCompressor"),Lorg_dellroad_lzma_client_LZMADecompressor_2_classLit=createForClass("org.dellroad.lzma.client.","LZMADecompressor"),Lorg_dellroad_lzma_client_LZMAByteArrayDecompressor_2_classLit=createForClass("org.dellroad.lzma.client.","LZMAByteArrayDecompressor"),Lorg_dellroad_lzma_demo_client_LZMADemo_2_classLit=createForClass("org.dellroad.lzma.demo.client.","LZMADemo"); -gwtOnLoad(function(){},"lzma_demo","");var get_mode_obj=function(){var modes=[{dictionarySize:16,fb:64,matchFinder:0,lc:3,lp:0,pb:2},{dictionarySize:20,fb:64,matchFinder:0,lc:3,lp:0,pb:2},{dictionarySize:19,fb:64,matchFinder:1,lc:3,lp:0,pb:2},{dictionarySize:20,fb:64,matchFinder:1,lc:3,lp:0,pb:2},{dictionarySize:21,fb:128,matchFinder:1,lc:3,lp:0,pb:2},{dictionarySize:22,fb:128,matchFinder:1,lc:3,lp:0,pb:2},{dictionarySize:23,fb:128,matchFinder:1,lc:3,lp:0,pb:2},{dictionarySize:24,fb:255,matchFinder:1,lc:3,lp:0,pb:2},{dictionarySize:25,fb:255,matchFinder:1,lc:3,lp:0,pb:2}];function isNumber(n){return!isNaN(parseFloat(n))&&isFinite(n)}return function(mode){if(!isNumber(mode)){mode=1}else{if(mode<1){mode=1}else if(mode>9){mode=9}}return modes[mode-1]}}();return{compress:compress,decompress:decompress}}();onmessage=function(e){if(e.data.action===action_compress){LZMA.compress(e.data.data,e.data.mode,e.data.callback_num)}else{LZMA.decompress(e.data.data,e.data.callback_num)}}; \ No newline at end of file diff --git a/app/resources/download.css b/app/src/download.css similarity index 96% rename from app/resources/download.css rename to app/src/download.css index 846b0531..ef09916d 100644 --- a/app/resources/download.css +++ b/app/src/download.css @@ -281,19 +281,12 @@ font-size: 10px; max-width: 400px; } - -/* Clearfix */ +.clearfix:before, .clearfix:after { - content: "."; - display: block; - height: 0; - clear: both; - visibility: hidden; + content: ""; + display: table; + border-collapse: collapse; } - -.clearfix {display: inline-block;} - -/* Hides from IE-mac \ */ -* html .clearfix {height: 1%;} -.clearfix {display: block;} -/* End hide from IE-mac */ +.clearfix:after { + clear: both; +} \ No newline at end of file diff --git a/app/src/download.js b/app/src/download.js index 899b8c90..df3b2f47 100644 --- a/app/src/download.js +++ b/app/src/download.js @@ -1,14 +1,15 @@ -/*jshint jquery: true, browser: true */ +/* eslint-env jquery, browser */ /*global Hash: false, JST: false, Model: false */ /*! * jQuery UI DownloadBuilder client-side JavaScript file - * http://jqueryui.com/download/ + * https://jqueryui.com/download/ * - * Copyright 2012 jQuery Foundation and other contributors + * Copyright OpenJS Foundation and other contributors * Released under the MIT license. - * http://jquery.org/license + * https://jquery.org/license */ -(function( $, Hash, JST, Model, undefined ) { +( function( $, Hash, JST, Model ) { + "use strict"; var dependencies, dependents, model, componentsLoad = $.Deferred(), @@ -22,35 +23,39 @@ if ( /^stage\./.test( location.host ) ) { $( "#download-builder form" ).attr( "action", function( index, href ) { return href.replace( /(download\.)/, "stage.$1" ); - }); + } ); downloadJqueryuiHost = downloadJqueryuiHost.replace( /(download\.)/, "stage.$1" ); } + function pluralize( count, singular, plural ) { + return count === 1 ? singular : plural; + } + function componentsFetch() { return $.ajax( downloadJqueryuiHost + "/download/components/", { dataType: "jsonp", data: { version: model.get( "version" ) } - }); + } ); } function renderServiceStatus( xhr ) { - var element = $( JST[ "service_status.html" ]({ + var element = $( JST[ "service_status.html" ]( { status: xhr.status, statusText: xhr.statusText, responseText: xhr.responseText - })); + } ) ); $( "#service-status" ).html( element ); } function themeFetch() { var dfd = $.Deferred(); - model.themeUrl(function( url ) { + model.themeUrl( function( url ) { $.ajax( url, { dataType: "jsonp" - }).done( dfd.resolve ).fail( dfd.reject ); - }); + } ).done( dfd.resolve ).fail( dfd.reject ); + } ); return dfd; } @@ -58,6 +63,14 @@ return $( "#download-builder .component-group-list input[type=checkbox]" ); } + function downloadOnOff() { + if ( !allComponents().filter( ":checked" ).length && $( "#theme" ).val() === "none" ) { + $( "#download-builder input[type=submit]" ).prop( "disabled", true ).addClass( "ui-state-disabled" ); + } else { + $( "#download-builder input[type=submit]" ).prop( "disabled", false ).removeClass( "ui-state-disabled" ); + } + } + function allGroup( referenceElement ) { return $( referenceElement ).closest( ".component-group" ).find( ".component-group-list input[type=checkbox]" ); } @@ -67,17 +80,19 @@ depElem = $(); options = options || {}; - elem.each(function() { + elem.each( function() { var elem = $( this ), name = elem.attr( "name" ); // Handle dependencies if ( value && !options.skipDependencies ) { if ( dependencies[ name ] ) { + // Whenever a checkbox is activated, also activate all dependencies depElem = depElem.add( dependencies[ name ] ); } } else if ( dependents[ name ] && !options.skipDependencies ) { + // Whenever a checkbox is deactivated, also deactivate all dependents depElem = depElem.add( dependents[ name ] ); } @@ -85,7 +100,7 @@ elem.prop( "checked", value ); modelUpdates[ name ] = value; - }); + } ); // Update dependencies if ( depElem.length ) { @@ -94,22 +109,26 @@ // Update toggle all if ( value ) { + // Set group toggle all if all components of its group are checked if ( !allGroup( elem ).filter( ":not(:checked)" ).length ) { $( elem ).closest( ".component-group" ).find( ".toggle input[type=checkbox]" ).prop( "checked", true ); } + // Set toggle all if all components are checked if ( !allComponents().filter( ":not(:checked)" ).length ) { $( elem ).closest( ".components" ).prev().find( ".toggleAll input[type=checkbox]" ).prop( "checked", true ); } } else { + // Unset group toggle all if no components of its group are checked if ( !allGroup( elem ).filter( ":checked" ).length ) { $( elem ).closest( ".component-group" ).find( ".toggle input[type=checkbox]" ).prop( "checked", false ); } + // Unset toggle all if no components are checked if ( !allComponents().filter( ":checked" ).length ) { - $( elem ).closest( ".components" ).prev().find( ".toggleAll input[type=checkbox]" ).prop( "checked", false); + $( elem ).closest( ".components" ).prev().find( ".toggleAll input[type=checkbox]" ).prop( "checked", false ); } } @@ -124,13 +143,13 @@ if ( !value ) { consolidatedDependents = $(); consolidatedNames = []; - elem.each(function() { + elem.each( function() { var name = $( this ).attr( "name" ); if ( dependents[ name ] && dependents[ name ].filter( ":checked" ).not( elem ).length > 0 ) { consolidatedNames.push( name ); consolidatedDependents = consolidatedDependents.add( dependents[ name ].filter( ":checked" ).not( elem ) ); } - }); + } ); // Validate if uncheck is allowed when it has dependents if ( consolidatedDependents.length > 0 ) { @@ -139,12 +158,12 @@ .attr( "title", "Remove " + consolidatedNames.join( ", " ) + "?" ) .append( $( "

" ).html( - "Are you sure you want to remove " + consolidatedNames.join( ", " ) + "? The following " + pluralize( consolidatedDependents.length, "component", "components" ) + " " + pluralize( consolidatedDependents.length, "depends", "depend" ) + " on it and will be removed: " + consolidatedDependents.map(function() { + "Are you sure you want to remove " + consolidatedNames.join( ", " ) + "? The following " + pluralize( consolidatedDependents.length, "component", "components" ) + " " + pluralize( consolidatedDependents.length, "depends", "depend" ) + " on it and will be removed: " + consolidatedDependents.map( function() { return "" + this.name + ""; - }).toArray().join( ", " ) + "." + } ).toArray().join( ", " ) + "." ) ) - .dialog({ + .dialog( { modal: true, buttons: { "Remove": function() { @@ -155,7 +174,7 @@ $( this ).remove(); } } - }) + } ) .dialog( "widget" ).addClass( "download-builder-dialog" ); } else { _check( elem, value, options ); @@ -167,14 +186,6 @@ } } - function downloadOnOff() { - if ( !allComponents().filter( ":checked" ).length && $( "#theme" ).val() === "none" ) { - $( "#download-builder input[type=submit]" ).prop( "disabled", true ).addClass( "ui-state-disabled" ); - } else { - $( "#download-builder input[type=submit]" ).prop( "disabled", false ).removeClass( "ui-state-disabled" ); - } - } - function drawToggleAll( className ) { return $( "

+
+ +3) Add a ready() handler to the document which initializes the color picker and link it to the text field with the following syntax:
+ + + +See demo1.html and demo2.html for an example. + +Styling +------- + +The color picker is a block-level element and is 195x195 pixels large. You can control the position by styling your placeholder (e.g. floating it). +Note that the black/white gradients inside wheel.png and mask.png were generated programmatically and cannot be recreated easily in an image editing program. + +Advanced Usage +-------------- + +###jQuery Method + + $(...).farbtastic() + $(...).farbtastic(callback) + +This creates color pickers in the selected objects. `callback` is optional and can be a: + +* _DOM Node_, _jQuery object_ or _jQuery selector_: the color picker will be linked to the selected element(s) by syncing the value (for form elements) and color (all elements). +* _Function_: this function will be called whenever the user chooses a different color. + +### Object + + $.farbtastic(placeholder) + $.farbtastic(placeholder, callback) + +Invoking `$.farbtastic(placeholder)` is the same as using `$(placeholder).farbtastic()` except that the Farbtastic object is returned instead of the jQuery object. This allows you to use the Farbtastic methods and properties below. + +Note that there is only one Farbtastic object per placeholder. If you call `$.farbtastic(placeholder)` twice _with the same placeholder_, you will get the same object back each time. + +The optional `callback` argument behaves exactly as for the jQuery method. + +### Methods + +`.linkTo(callback)` - Allows you to set a new callback. Any existing callbacks are removed. See above for the meaning of `callback`. + +`.setColor(string)` - Sets the picker color to the given color in hex representation. + +`.setColor([h, s, l])` - Sets the picker color to the given color in normalized HSL (0..1 scale). + +### Properties + +`.linked` - The elements (jQuery object) or callback function this picker is linked to. + +`.color` - Current color in hex representation. + +`.hsl` - Current color in normalized HSL. + +Changelog +--------- + +### 1.3u (unofficial) - 2010/2/17 + +* Updated style to use anonymous function wrapper per http://docs.jquery.com/Plugins/Authoring#Custom_Alias. +* Now it uses the `.offset()` method available as of jQuery 1.2.x. +* Works with JavaScript aggregators and compressors. + +### 1.2 - 2007/01/08 + +* Fixed bug with linking multiple fields with the same value. + +### 1.1 - 2006/10/27 + +* Work around for the transparent PNGs in Internet Explorer. +* Better mouse handling code to accomodate CSS-based layouts better. + +### 1.0 - 2006/07/14 + +* Initial release. diff --git a/app/resources/external/farbtastic.css b/external/farbtastic/farbtastic.css similarity index 78% rename from app/resources/external/farbtastic.css rename to external/farbtastic/farbtastic.css index 7846aada..07d953f2 100644 --- a/app/resources/external/farbtastic.css +++ b/external/farbtastic/farbtastic.css @@ -16,18 +16,18 @@ height: 101px; } .farbtastic .wheel { - background: url("wheel.png") no-repeat; + background: url(wheel.png) no-repeat; width: 195px; height: 195px; } .farbtastic .overlay { - background: url("mask.png") no-repeat; + background: url(mask.png) no-repeat; } .farbtastic .marker { width: 17px; height: 17px; margin: -8px 0 0 -8px; overflow: hidden; - background: url("marker.png") no-repeat; + background: url(marker.png) no-repeat; } diff --git a/app/src/external/farbtastic.js b/external/farbtastic/farbtastic.js similarity index 96% rename from app/src/external/farbtastic.js rename to external/farbtastic/farbtastic.js index c36eac49..a609eec7 100644 --- a/app/src/external/farbtastic.js +++ b/external/farbtastic/farbtastic.js @@ -6,8 +6,6 @@ */ (function($) { -var triggerChangeDelay = 200; - $.fn.farbtastic = function (options) { $.farbtastic(this, options); return this; @@ -192,14 +190,7 @@ $._farbtastic = function (container, callback) { // Change linked value $(fb.callback).each(function() { if (this.value && this.value != fb.color) { - var element = $(this); this.value = fb.color; - if(fb.triggerChange) { - clearInterval(fb.triggerChange); - } - fb.triggerChange = setTimeout(function() { - element.trigger("change"); - }, triggerChangeDelay); } }); } diff --git a/external/farbtastic/farbtastic.min.js b/external/farbtastic/farbtastic.min.js new file mode 100644 index 00000000..e4c85285 --- /dev/null +++ b/external/farbtastic/farbtastic.min.js @@ -0,0 +1,14 @@ +/*! + * Farbtastic: jQuery color picker plug-in v1.3u + * + * Licensed under the GPL license: + * http://www.gnu.org/licenses/gpl.html + */ +(function(e){e.fn.farbtastic=function(f){e.farbtastic(this,f);return this};e.farbtastic=function(f,l){f=e(f).get(0);return f.farbtastic||(f.farbtastic=new e._farbtastic(f,l))};e._farbtastic=function(f,l){var a=this;e(f).html('
');var k=e(".farbtastic",f);a.wheel=e(".wheel",f).get(0);a.radius=84;a.square=100;a.width=194;navigator.appVersion.match(/MSIE [0-6]\./)&& +e("*",k).each(function(){if(this.currentStyle.backgroundImage!="none"){var b=this.currentStyle.backgroundImage;b=this.currentStyle.backgroundImage.substring(5,b.length-2);e(this).css({backgroundImage:"none",filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=crop, src='"+b+"')"})}});a.linkTo=function(b){typeof a.callback=="object"&&e(a.callback).unbind("keyup",a.updateValue);a.color=null;if(typeof b=="function")a.callback=b;else if(typeof b=="object"||typeof b=="string"){a.callback= +e(b);a.callback.bind("keyup",a.updateValue);a.callback.get(0).value&&a.setColor(a.callback.get(0).value)}return this};a.updateValue=function(){this.value&&this.value!=a.color&&a.setColor(this.value)};a.setColor=function(b){var c=a.unpack(b);if(a.color!=b&&c){a.color=b;a.rgb=c;a.hsl=a.RGBToHSL(a.rgb);a.updateDisplay()}return this};a.setHSL=function(b){a.hsl=b;a.rgb=a.HSLToRGB(b);a.color=a.pack(a.rgb);a.updateDisplay();return this};a.widgetCoords=function(b){var c=e(a.wheel).offset();return{x:b.pageX- +c.left-a.width/2,y:b.pageY-c.top-a.width/2}};a.mousedown=function(b){if(!document.dragging){e(document).bind("mousemove",a.mousemove).bind("mouseup",a.mouseup);document.dragging=true}var c=a.widgetCoords(b);a.circleDrag=Math.max(Math.abs(c.x),Math.abs(c.y))*2>a.square;a.mousemove(b);return false};a.mousemove=function(b){var c=a.widgetCoords(b);if(a.circleDrag){b=Math.atan2(c.x,-c.y)/6.28;if(b<0)b+=1;a.setHSL([b,a.hsl[1],a.hsl[2]])}else{b=Math.max(0,Math.min(1,-(c.x/a.square)+0.5));c=Math.max(0,Math.min(1, +-(c.y/a.square)+0.5));a.setHSL([a.hsl[0],b,c])}return false};a.mouseup=function(){e(document).unbind("mousemove",a.mousemove);e(document).unbind("mouseup",a.mouseup);document.dragging=false};a.updateDisplay=function(){var b=a.hsl[0]*6.28;e(".h-marker",k).css({left:Math.round(Math.sin(b)*a.radius+a.width/2)+"px",top:Math.round(-Math.cos(b)*a.radius+a.width/2)+"px"});e(".sl-marker",k).css({left:Math.round(a.square*(0.5-a.hsl[1])+a.width/2)+"px",top:Math.round(a.square*(0.5-a.hsl[2])+a.width/2)+"px"}); +e(".color",k).css("backgroundColor",a.pack(a.HSLToRGB([a.hsl[0],1,0.5])));if(typeof a.callback=="object"){e(a.callback).css({backgroundColor:a.color,color:a.hsl[2]>0.5?"#000":"#fff"});e(a.callback).each(function(){if(this.value&&this.value!=a.color)this.value=a.color})}else typeof a.callback=="function"&&a.callback.call(a,a.color)};a.pack=function(b){var c=Math.round(b[0]*255),d=Math.round(b[1]*255);b=Math.round(b[2]*255);return"#"+(c<16?"0":"")+c.toString(16)+(d<16?"0":"")+d.toString(16)+(b<16?"0": +"")+b.toString(16)};a.unpack=function(b){if(b.length==7)return[parseInt("0x"+b.substring(1,3))/255,parseInt("0x"+b.substring(3,5))/255,parseInt("0x"+b.substring(5,7))/255];else if(b.length==4)return[parseInt("0x"+b.substring(1,2))/15,parseInt("0x"+b.substring(2,3))/15,parseInt("0x"+b.substring(3,4))/15]};a.HSLToRGB=function(b){var c,d=b[0];c=b[1];b=b[2];c=b<=0.5?b*(c+1):b+c-b*c;b=b*2-c;return[this.hueToRGB(b,c,d+0.33333),this.hueToRGB(b,c,d),this.hueToRGB(b,c,d-0.33333)]};a.hueToRGB=function(b,c, +d){d=d<0?d+1:d>1?d-1:d;if(d*6<1)return b+(c-b)*d*6;if(d*2<1)return c;if(d*3<2)return b+(c-b)*(0.66666-d)*6;return b};a.RGBToHSL=function(b){var c,d,m,g,h=b[0],i=b[1],j=b[2];c=Math.min(h,Math.min(i,j));b=Math.max(h,Math.max(i,j));d=b-c;g=(c+b)/2;m=0;if(g>0&&g<1)m=d/(g<0.5?2*g:2-2*g);c=0;if(d>0){if(b==h&&b!=i)c+=(i-j)/d;if(b==i&&b!=j)c+=2+(j-h)/d;if(b==j&&b!=h)c+=4+(h-i)/d;c/=6}return[c,m,g]};e("*",k).mousedown(a.mousedown);a.setColor("#000000");l&&a.linkTo(l)}})(jQuery); diff --git a/app/resources/images/farbtastic/marker.png b/external/farbtastic/marker.png old mode 100644 new mode 100755 similarity index 100% rename from app/resources/images/farbtastic/marker.png rename to external/farbtastic/marker.png diff --git a/app/resources/images/farbtastic/mask.png b/external/farbtastic/mask.png similarity index 100% rename from app/resources/images/farbtastic/mask.png rename to external/farbtastic/mask.png diff --git a/app/resources/images/farbtastic/wheel.png b/external/farbtastic/wheel.png similarity index 100% rename from app/resources/images/farbtastic/wheel.png rename to external/farbtastic/wheel.png diff --git a/frontend.js b/frontend.js index 0c8fc005..5c44046e 100644 --- a/frontend.js +++ b/frontend.js @@ -1,7 +1,8 @@ -var _ = require( "underscore" ), - config = require( "./config" ), +"use strict"; + +var config = require( "./config" ), Download = require( "./download" ), - fs = require( "fs" ), + fs = require( "node:fs" ), Handlebars = require( "handlebars" ), JqueryUi = require( "./lib/jquery-ui" ), ThemeRoller = require( "./themeroller" ); @@ -20,7 +21,7 @@ var errorTemplate = Handlebars.compile( fs.readFileSync( __dirname + "/template/ * */ var Frontend = function( options ) { - options = _.extend( {}, Frontend.defaults, options ); + this.options = options = Object.assign( {}, Frontend.defaults, options ); if ( options.config && typeof options.config === "object" ) { require( "./lib/config" ).get = function() { return options.config; @@ -35,7 +36,9 @@ Frontend.defaults = { host: "", resources: { jqueryVersion: config.jquery, - jqueryuiVersion: JqueryUi.getStable().pkg.version + jqueryuiVersion: JqueryUi.getStable().pkg.version, + jqueryVersionForThemeRoller: config.themeroller.jquery, + jqueryuiVersionForThemeroller: config.themeroller.jqueryUi } }; diff --git a/grunt-tasks/minify.js b/grunt-tasks/minify.js new file mode 100644 index 00000000..dfe37f59 --- /dev/null +++ b/grunt-tasks/minify.js @@ -0,0 +1,26 @@ +"use strict"; + +const swc = require( "@swc/core" ); +const swcOptions = require( "../lib/swc-options" ); + +module.exports = function( grunt ) { + +grunt.registerMultiTask( "minify", async function() { + const done = this.async(); + + for ( const file of this.files ) { + const contents = file.src + .map( singleFile => grunt.file.read( singleFile ) ) + .join( "\n" ); + + const { code } = await swc.minify( contents, swcOptions ); + + grunt.file.write( file.dest, code ); + + grunt.log.writeln( `File ${ file.dest } created.` ); + } + + done(); +} ); + +}; diff --git a/lib/banner.js b/lib/banner.js index 704e9829..39837ca6 100644 --- a/lib/banner.js +++ b/lib/banner.js @@ -1,15 +1,19 @@ +"use strict"; + var template, templateMin, - _ = require( "underscore" ), - dateformat = require( "dateformat" ), - fs = require( "fs" ), + fs = require( "node:fs" ), handlebars = require( "handlebars" ); // 1: Currently, jQuery UI is using minified banners either for full or minified files. Anyway, DownloadBuilder is ready to support different banners. template = handlebars.compile( fs.readFileSync( __dirname + "/../template/zip/banner.min" /* 1 */, "utf8" ) ); templateMin = handlebars.compile( fs.readFileSync( __dirname + "/../template/zip/banner.min", "utf8" ) ); -function today( format ) { - return dateformat( new Date(), format ); +function todayDate() { + return new Date().toISOString().replace( /T.*$$/, "" ); +} + +function todayYear() { + return `${ new Date().getFullYear() }`; } module.exports = function( pkg, fileNames, options ) { @@ -18,15 +22,15 @@ module.exports = function( pkg, fileNames, options ) { if ( options.minify ) { render = templateMin; } - return render({ + return render( { authorName: pkg.author.name, customThemeUrl: options.customThemeUrl, - date: today( "isoDate" ), - fileNames: fileNames ? fileNames.join(", ") : null, + date: todayDate(), + fileNames: fileNames ? fileNames.join( ", " ) : null, homepage: pkg.homepage, - licenses: _.pluck( pkg.licenses, "type" ).join( ", " ), + licenses: pkg.license || pkg.licenses.map( ( { type } ) => type ).join( ", " ), title: pkg.title || pkg.name, version: pkg.version, - year: today( "yyyy" ) - }); + year: todayYear() + } ); }; diff --git a/lib/builder.1.10.0.js b/lib/builder.1.10.0.js deleted file mode 100644 index e9de886f..00000000 --- a/lib/builder.1.10.0.js +++ /dev/null @@ -1,206 +0,0 @@ -var demoIndexTemplate, docsTemplate, stripBanner, - banner = require( "./banner" ), - Files = require( "./files" ), - fs = require( "fs" ), - handlebars = require( "handlebars" ), - path = require( "path" ), - sqwish = require( "sqwish" ), - ThemeRoller = require( "./themeroller" ), - util = require( "./util" ); - -demoIndexTemplate = handlebars.compile( fs.readFileSync( __dirname + "/../template/zip/demos_index.html", "utf8" ) ); -docsTemplate = handlebars.compile( fs.readFileSync( __dirname + "/../template/zip/docs.html", "utf8" ) ); -stripBanner = util.stripBanner; - -/** - * Builder 1.10 - */ -function Builder_1_10_0( build, jqueryUi, components, options, callback ) { - var _bundleCss, baseCss, baseCssMin, cssComponentFileNames, existingCss, jsComponentFileNames, selectedDemoRe, selectedRe, - files = jqueryUi.files(), - min = function( file ) { - return files.min( file ); - }, - selected = function( file ) { - return components.length && selectedRe.test( file.path ); - }, - selectedDemos = function( filepath ) { - return components.length && selectedDemoRe.test( filepath ); - }; - - options = options || {}; - selectedRe = new RegExp( components.join( "|" ) ); - - build.files = files; - build.pkg = jqueryUi.pkg; - - build.baseTheme = util.stripBanner( files.get( "themes/base/jquery.ui.theme.css" ) ); - build.baseThemeMin = util.stripBanner( files.min( files.get( "themes/base/jquery.ui.theme.css" ) ) ); - - build.commonFiles = files.commonFiles; - build.componentFiles = files.componentFiles.filter( selected ); - - build.componentMinFiles = build.componentFiles.filter(function( file ) { - return (/^ui\//).test( file.path ); - }).map( min ); - - build.baseThemeFiles = files.baseThemeFiles; - build.baseThemeMinFiles = files.baseThemeFiles.filter( selected ).map( min ); - - build.baseThemeExceptThemeOrImages = files.baseThemeFiles.filter(function( file ) { - if ( (/jquery.ui.theme|jquery-ui|images/).test( file.path ) ) { - return false; - } - if ( (/jquery.ui.all|jquery.ui.base/).test( file.path ) ) { - return true; - } - return selected( file ); - }); - - build.baseThemeImages = files.baseThemeFiles.filter(function( file ) { - return (/images/).test( file.path ); - }); - - // I18n files - if ( components.indexOf( "datepicker" ) >= 0 ) { - build.i18nFiles = files.i18nFiles; - build.i18nMinFiles = files.i18nFiles.map( min ); - build.bundleI18n = Files({ - path: "jquery-ui-i18n.js", - data: files.i18nFiles.reduce(function( sum, file ) { - return sum + stripBanner( file ); - }, banner( jqueryUi.pkg, files.i18nFiles.paths().map( path.basename ) ) ) - }); - build.bundleI18nMin = Files({ - path: "jquery-ui-i18n.min.js", - data: banner( jqueryUi.pkg, files.i18nFiles.paths().map( path.basename ), { minify: true }) + stripBanner( files.min( build.bundleI18n[ 0 ] ) ) - }); - } else { - build.i18nFiles = build.i18nMinFiles = build.bundleI18n = build.bundleI18nMin = Files(); - } - - // Bundle JS (and minified) - jsComponentFileNames = components.map(function( component ) { - return "jquery.ui." + component + ".js"; - }); - build.bundleJs = Files({ - path: "jquery-ui.js", - data: build.components.reduce(function( sum, component ) { - return sum + stripBanner( files.get( "ui/jquery.ui." + component + ".js" ) ); - }, banner( jqueryUi.pkg, jsComponentFileNames ) ) - }); - build.bundleJsMin = Files({ - path: "jquery-ui.min.js", - data: build.components.reduce(function( sum, component ) { - return sum + stripBanner( files.min( files.get( "ui/jquery.ui." + component + ".js" ) ) ); - }, banner( jqueryUi.pkg, jsComponentFileNames, { minify: true } ) ) - }); - - // Bundle CSS (and minified) - existingCss = function( component ) { - return files.get( "themes/base/jquery.ui." + component + ".css" ) !== undefined; - }; - baseCss = components.filter( existingCss ).reduce(function( sum, component ) { - return sum + stripBanner( files.get( "themes/base/jquery.ui." + component + ".css" ) ); - }, "" ); - baseCssMin = components.filter( existingCss ).reduce(function( sum, component ) { - return sum + stripBanner( files.min( files.get( "themes/base/jquery.ui." + component + ".css" ) ) ); - }, "" ); - cssComponentFileNames = components.filter( existingCss ).map(function( component ) { - return "jquery.ui." + component + ".css"; - }); - if ( options.scope ) { - // Scope all rules due to specificity issue with tabs (see #gt87) - baseCss = util.scope( baseCss, options.scope ); - baseCssMin = util.scope( baseCssMin, options.scope ); - } - build.baseThemeMinFiles.push({ - path: "themes/base/jquery.ui.theme.min.css", - data: banner( jqueryUi.pkg, null, { minify: true } ) + build.baseCssMin - }); - _bundleCss = function( base, theme, options ) { - var bundleCss = base, - fileNames = cssComponentFileNames; - options = options || {}; - if ( theme instanceof ThemeRoller ) { - // customTheme: - if ( !theme.isNull ) { - if ( options.minify ) { - bundleCss = bundleCss + sqwish.minify( stripBanner( { data: theme.css() } ) ); - } else { - bundleCss = bundleCss + "\n" + stripBanner( { data: theme.css() } ); - } - fileNames = fileNames.concat( "jquery.ui.theme.css" ); - options.customThemeUrl = theme.url(); - } - } else { - // baseTheme: - bundleCss = bundleCss + "\n" + theme; - fileNames = fileNames.concat( "jquery.ui.theme.css" ); - } - return banner( jqueryUi.pkg, fileNames, options ) + bundleCss; - }; - build.bundleCss = function( theme ) { - return Files({ - path: "jquery-ui.css", - data: _bundleCss( baseCss, theme ) - }); - }; - build.bundleCssMin = function( theme ) { - return Files({ - path: "jquery-ui.min.css", - data: _bundleCss( baseCssMin, theme, { minify: true } ) - }); - }; - - // Demo files - if ( components.indexOf( "effect" ) >= 0 ) { - selectedDemoRe = new RegExp( components.concat( [ "addClass", "animate", "hide", "removeClass", "show", "switchClass", "toggle", "toggleClass" ] ).join( "|" ) ); - } else { - selectedDemoRe = new RegExp( components.join( "|" ) ); - } - build.demoFiles = files.demoFiles.filter(function( file ) { - var componentSubdir = file.path.split( "/" )[ 1 ]; - return selectedDemos( componentSubdir ); - }); - build.demoFiles.push({ - path: "demos/index.html", - data: demoIndexTemplate({ - demos: files.demoSubdirs.filter( selectedDemos ) - }) - }); - - // Doc files - if ( files.docFiles.length ) { - build.docFiles = files.docFiles.filter(function( file ) { - return !(/effect/).test( file.path ); - }).filter( selected ).concat( components.filter(function( component ) { - return (/effect-/).test( component ); - }).map(function( component ) { - var path = component.replace( /^effect-(.*)$/, "docs/$1-effect.html" ); - return files.get( path ); - })); - if ( components.indexOf( "effect-scale" ) >= 0 ) { - build.docFiles.push( files.get( "docs/puff-effect.html" ), files.get( "docs/size-effect.html" ) ); - } - build.docFiles = build.docFiles.map(function( file ) { - return { - path: file.path, - data: docsTemplate({ - component: path.basename( file.path ).replace( /\..*/, "" ), - body: file.data - }) - }; - }); - } - - // Test files - build.testFiles = files.testFiles; - - // Ad hoc - build.jqueryCore = files.jqueryCore; - - callback( null, build ); -} - -module.exports = Builder_1_10_0; diff --git a/lib/builder.1.11.0.js b/lib/builder.1.11.0.js deleted file mode 100644 index 9fdf8758..00000000 --- a/lib/builder.1.11.0.js +++ /dev/null @@ -1,324 +0,0 @@ -var _basename, bundleJsIntro, bundleI18nIntro, bundleOutro, demoIndexTemplate, docsTemplate, flatten, stripBanner, - async = require( "async" ), - banner = require( "./banner" ), - Files = require( "./files" ), - fs = require( "fs" ), - handlebars = require( "handlebars" ), - path = require( "path" ), - rjs = require( "./rjs" ), - sqwish = require( "sqwish" ), - ThemeRoller = require( "./themeroller" ), - util = require( "./util" ); - -bundleJsIntro = "(function( factory ) {\n" + - " if ( typeof define === \"function\" && define.amd ) {\n" + - "\n" + - " // AMD. Register as an anonymous module.\n" + - " define([ \"jquery\" ], factory );\n" + - " } else {\n" + - "\n" + - " // Browser globals\n" + - " factory( jQuery );\n" + - " }\n" + - "}(function( $ ) {"; - -bundleI18nIntro = "(function( factory ) {\n" + - " if ( typeof define === \"function\" && define.amd ) {\n" + - "\n" + - " // AMD. Register as an anonymous module.\n" + - " define([ \"jquery\" ], factory );\n" + - " } else {\n" + - "\n" + - " // Browser globals\n" + - " factory( jQuery );\n" + - " }\n" + - "}(function( $ ) {\n" + - "\n" + - "var datepicker = $.datepicker;\n"; - -bundleOutro = "}));"; -demoIndexTemplate = handlebars.compile( fs.readFileSync( __dirname + "/../template/zip/demos_index.html", "utf8" ) ); -docsTemplate = handlebars.compile( fs.readFileSync( __dirname + "/../template/zip/docs.html", "utf8" ) ); -flatten = util.flatten; -stripBanner = util.stripBanner; - -// Fix path.basename bug: it leaves a trailing slash. -// This has been fixed in nodejs v0.9.6. So, remove this workaround when node baseline gets updated. -_basename = path.basename; -path.basename = function() { - return _basename.apply( _basename, arguments ).replace( /\/$/, "" ); -}; - -function camelCase( input ) { - return input.toLowerCase().replace( /[-/](.)/g, function( match, group1 ) { - return group1.toUpperCase(); - }); -} - -function rjsConfig( attributes ) { - return { - files: attributes.files, - config: { - appDir: "ui", - baseUrl: ".", - paths: { - jquery: "../" + attributes.files.jqueryCore[ 0 ].path.replace( /\.js$/, "" ) - }, - wrap: { - start: attributes.intro, - end: bundleOutro - }, - modules: [{ - name: "output", - include: attributes.include, - exclude: attributes.exclude, - create: true - }], - onBuildWrite: function ( id, path, contents ) { - var name = camelCase( id.replace( /ui\//, "" ).replace( /\.js$/, "" ) ); - return contents - - // Remove UMD wrapper. - .replace( /\(function\( factory[\s\S]*?\(function\( [^\)]* \) \{/, "" ) - .replace( /\}\)\);\s*?$/, "" ) - - // Replace "return " exports for "" or completely remove them when appropriate. - .replace( /\nreturn \$.(ui.autocomplete|ui.button|datepicker|ui.draggable|ui.droppable|effects|ui.position|ui.resizable|widget);/g, "" ) - .replace( /\nreturn /g, "" ); - } - } - }; -} - -/** - * Builder 1.11 - */ -function Builder_1_11_0( build, jqueryUi, components, options, callback ) { - var _bundleCss, baseCss, baseCssMin, cssComponentFileNames, docsCategories, existingCss, selectedDemoRe, selectedRe, - files = jqueryUi.files(), - min = function( file ) { - return files.min( file ); - }, - selected = function( componentOrFile ) { - return components.length && selectedRe.test( componentOrFile.name || componentOrFile.path ); - }, - selectedDemos = function( filepath ) { - return components.length && selectedDemoRe.test( filepath ); - }; - - options = options || {}; - selectedRe = new RegExp( components.join( "|" ) ); - - build.files = files; - build.pkg = jqueryUi.pkg; - - build.baseTheme = util.stripBanner( files.get( "themes/base/theme.css" ) ); - build.baseThemeMin = util.stripBanner( files.min( files.get( "themes/base/theme.css" ) ) ); - - build.commonFiles = files.commonFiles; - build.componentFiles = files.componentFiles.filter( selected ); - - build.componentMinFiles = build.componentFiles.filter(function( file ) { - return (/^ui\//).test( file.path ); - }).map( min ); - - build.baseThemeFiles = files.baseThemeFiles; - build.baseThemeMinFiles = files.baseThemeFiles.filter( selected ).map( min ); - - build.baseThemeExceptThemeOrImages = files.baseThemeFiles.filter(function( file ) { - if ( (/theme\W|jquery-ui|images/).test( file.path ) ) { - return false; - } - if ( (/all|base/).test( file.path ) ) { - return true; - } - return selected( file ); - }); - - build.baseThemeImages = files.baseThemeFiles.filter(function( file ) { - return (/images/).test( file.path ); - }); - - // Bundle CSS (and minified) - existingCss = function( component ) { - return files.get( "themes/base/" + component + ".css" ) !== undefined; - }; - baseCss = components.filter( existingCss ).reduce(function( sum, component ) { - return sum + stripBanner( files.get( "themes/base/" + component + ".css" ) ); - }, "" ); - baseCssMin = components.filter( existingCss ).reduce(function( sum, component ) { - return sum + stripBanner( files.min( files.get( "themes/base/" + component + ".css" ) ) ); - }, "" ); - cssComponentFileNames = components.filter( existingCss ).map(function( component ) { - return component + ".css"; - }); - if ( options.scope ) { - // Scope all rules due to specificity issue with tabs (see #gt87) - baseCss = util.scope( baseCss, options.scope ); - baseCssMin = util.scope( baseCssMin, options.scope ); - } - build.baseThemeMinFiles.push({ - path: "themes/base/theme.min.css", - data: banner( jqueryUi.pkg, null, { minify: true } ) + build.baseCssMin - }); - _bundleCss = function( base, theme, options ) { - var bundleCss = base, - fileNames = cssComponentFileNames; - options = options || {}; - if ( theme instanceof ThemeRoller ) { - // customTheme: - if ( !theme.isNull ) { - if ( options.minify ) { - bundleCss = bundleCss + sqwish.minify( stripBanner( { data: theme.css() } ) ); - } else { - bundleCss = bundleCss + "\n" + stripBanner( { data: theme.css() } ); - } - fileNames = fileNames.concat( "theme.css" ); - options.customThemeUrl = theme.url(); - } - } else { - // baseTheme: - bundleCss = bundleCss + "\n" + theme; - fileNames = fileNames.concat( "theme.css" ); - } - return banner( jqueryUi.pkg, fileNames, options ) + bundleCss; - }; - build.bundleCss = function( theme ) { - return Files({ - path: "jquery-ui.css", - data: _bundleCss( baseCss, theme ) - }); - }; - build.bundleCssMin = function( theme ) { - return Files({ - path: "jquery-ui.min.css", - data: _bundleCss( baseCssMin, theme, { minify: true } ) - }); - }; - - // Demo files - selectedDemoRe = new RegExp( components.join( "|" ) ); - build.demoFiles = files.demoFiles.filter(function( file ) { - var componentSubdir = file.path.split( "/" )[ 1 ]; - return selectedDemos( componentSubdir ); - }); - build.demoFiles.push({ - path: "demos/index.html", - data: demoIndexTemplate({ - demos: files.demoSubdirs.filter( selectedDemos ) - }) - }); - - // Doc files - if ( files.docFiles.length && files.docsCategories ) { - build.docFiles = jqueryUi.components().filter( selected ).map(function( component ) { - return component.docs; - }).map(function( doc ) { - var slug; - // Expand categories's pages and posts - if ( (/\/category\//).test( doc ) ) { - slug = path.basename( doc ); - return files.docsCategories[ slug ].posts; - } - return doc; - }).reduce( flatten, [] ).reduce(function( sum, doc ) { - var filename = path.basename( doc ) + ".html", - file = files.get( path.join( "docs", filename ) ); - if ( file ) { - sum.push({ - path: file.path, - data: docsTemplate({ - component: path.basename( file.path ).replace( /\..*/, "" ), - body: file.data - }) - }); - } - return sum; - }, Files() ); - } - - // Test files - build.testFiles = files.testFiles; - - // Ad hoc - build.jqueryCore = files.jqueryCore; - - // I18n files - function i18nFiles( callback ) { - if ( components.indexOf( "datepicker" ) >= 0 ) { - build.i18nFiles = files.i18nFiles; - build.i18nMinFiles = files.i18nFiles.map( min ); - async.series([ - function( callback ) { - rjs( rjsConfig({ - files: files, - intro: bundleI18nIntro, - include: files.i18nFiles.rename( /ui\//, "" ).rename( /\.js$/, "" ).paths(), - exclude: [ "jquery", "core", "datepicker" ] - }), function( error, data ) { - if ( error ) { - return callback( error ); - } - build.bundleI18n = Files({ - path: "jquery-ui-i18n.js", - data: banner( jqueryUi.pkg, files.i18nFiles.paths().map( path.basename ) ) + data - }); - callback(); - }); - }, - function( callback ) { - build.bundleI18nMin = Files({ - path: "jquery-ui-i18n.min.js", - data: banner( jqueryUi.pkg, files.i18nFiles.paths().map( path.basename ), { minify: true }) + stripBanner( files.min( build.bundleI18n[ 0 ] ) ) - }); - callback(); - } - ], callback ); - } else { - build.i18nFiles = build.i18nMinFiles = build.bundleI18n = build.bundleI18nMin = Files(); - callback(); - } - } - - // Bundle JS (and minified) - function bundleJs( callback ) { - var jsComponentFileNames = components.map(function( component ) { - return component + ".js"; - }); - async.series([ - function( callback ) { - rjs( rjsConfig({ - files: files, - intro: bundleJsIntro, - include: components, - exclude: [ "jquery" ] - }), function( error, data ) { - if ( error ) { - return callback( error ); - } - build.bundleJs = Files({ - path: "jquery-ui.js", - data: banner( jqueryUi.pkg, jsComponentFileNames ) + data - }); - callback(); - }); - }, - function( callback ) { - build.bundleJsMin = Files({ - path: "jquery-ui.min.js", - data: banner( jqueryUi.pkg, jsComponentFileNames, { minify: true } ) + stripBanner( files.min( build.bundleJs[ 0 ] ) ) - }); - callback(); - } - ], callback ); - } - - async.series([ - i18nFiles, - bundleJs - ], function( error ) { - callback( error, build ); - }); -} - -module.exports = Builder_1_11_0; diff --git a/lib/builder.js b/lib/builder.js deleted file mode 100644 index 3fcec9a6..00000000 --- a/lib/builder.js +++ /dev/null @@ -1,88 +0,0 @@ -var cache, - Cache = require( "./cache" ), - semver = require( "semver" ); - -cache = new Cache( "Build Cache" ); - -/** - * Builder( jqueryUi, components, options ) - * - jqueryUi [ instanceof JqueryUi ]: jQuery UI object. - * - components [ Array / String ]: Array with the component names, or a special string ":all:" that selects all the components. - * - options: details below. - * - * options: - * - scope [ String ]: Insert a scope string on the css selectors. - */ -function Builder( jqueryUi, components, options ) { - this.jqueryUi = jqueryUi; - this.components = this.expandComponents( components ); - this.options = options; -} - -Builder.prototype = { - build: function( callback ) { - var cacheKey = this.jqueryUi.pkg.version + JSON.stringify( this.expandComponents( this.components ) ), - cached = cache.get( cacheKey ); - - if ( cached ) { - - // if we have data, call the callback, otherwise push ours - if ( cached.data ) { - callback( null, cached.data ); - } else { - cached.callbacks.push( callback ); - } - return true; - } - - cached = { - callbacks: [ callback ] - }; - cache.set( cacheKey, cached ); - - function done( err, data ) { - var callbacks = cached.callbacks; - if ( !err ) { - cached.data = data; - delete cached.callbacks; - } - callbacks.forEach(function( callback ) { - callback( err, data ); - }); - delete cached.callbacks; - if ( err ) { - cache.destroy( cacheKey ); - } - } - - // FIXME s/1.11.0pre/1.11.0 - if ( semver.gte( this.jqueryUi.pkg.version, "1.11.0pre" ) ) { - require( "./builder.1.11.0" )( this, this.jqueryUi, this.components, this.options, done ); - } else { - require( "./builder.1.10.0" )( this, this.jqueryUi, this.components, this.options, done ); - } - }, - - expandComponents: function( components ) { - var allComponents = this.jqueryUi.components().map(function( element ) { - return element.name; - }), - invalidComponent = function( element ) { - return allComponents.indexOf( element ) < 0; - }; - if ( typeof components === "string" && components === ":all:" ) { - components = allComponents; - } - // Validate components - if ( components.some( invalidComponent ) ) { - throw new Error( "Builder: invalid components [ \"" + components.filter( invalidComponent ).join( "\", \"" ) + "\" ]" ); - } - return components; - }, - - get: function( file ) { - return this.files.get( file ); - } -}; - -module.exports = Builder; diff --git a/lib/cache.js b/lib/cache.js index 7d7367bd..19b93cda 100644 --- a/lib/cache.js +++ b/lib/cache.js @@ -1,27 +1,28 @@ -var Cache, cacheCron, cacheCronTimeout, cacheExpiresTime, caches, - logger = require( "simple-log" ).init( "download.jqueryui.com" ); +"use strict"; + +var Cache, cacheCron, cacheCronTimeout, cacheExpiresTime, caches; cacheExpiresTime = 0; caches = []; cacheCron = function() { var currentTime = Date.now(); - caches.forEach(function( cache ) { + caches.forEach( function( cache ) { var count = { cached: 0, deleted: 0 }; - cache.each(function( value, key ) { + cache.each( function( value, key ) { count.cached++; if ( cache.expires[ key ] < currentTime ) { cache.destroy( key ); count.deleted++; } - }); + } ); - logger.log( cache.name + " Cleanup:", count ); - }); + console.log( cache.name + " Cleanup:", count ); + } ); cacheCronTimeout = setTimeout( cacheCron, cacheExpiresTime ); }; diff --git a/lib/config.js b/lib/config.js index 99ae403e..073c2c6e 100644 --- a/lib/config.js +++ b/lib/config.js @@ -1,6 +1,8 @@ -var Config, jqueryUi, - fs = require( "fs" ), - path = require( "path" ); +"use strict"; + +var Config, + fs = require( "node:fs" ), + path = require( "node:path" ); Config = module.exports = function() { var config = Config.get(); @@ -8,13 +10,15 @@ Config = module.exports = function() { // Validate jqueryUi, eg: // "jqueryUi": [ // { - // "version": "1.10.0", - // "dependsOn": "jQuery 1.7+", + // "version": "1.14.1", + // "dependsOn": "jQuery 1.12+ / 2.2+ / 3.6+ / 4.0+", + // "label": "Stable", // "stable": true // }, // { - // "version": "1.9.1", - // "dependsOn": "jQuery 1.6+" + // "version": "1.13.3", + // "dependsOn": "jQuery 1.8+", + // "label": "Legacy" // } // ] if ( config.jqueryUi == null ) { @@ -23,13 +27,13 @@ Config = module.exports = function() { if ( !Array.isArray( config.jqueryUi ) ) { throw new Error( "Invalid jqueryUi branch/tag in config.json" ); } - config.jqueryUi = config.jqueryUi.map(function( entry ) { + config.jqueryUi = config.jqueryUi.map( function( entry ) { if ( typeof entry !== "object" || !entry.version ) { throw new Error( "Invalid jqueryUi entry " + JSON.stringify( entry ) + " in config.json" ); } entry.ref = entry.version; return entry; - }); + } ); // Validate jquery if ( config.jquery == null ) { diff --git a/lib/docs.js b/lib/docs.js deleted file mode 100644 index e53efc99..00000000 --- a/lib/docs.js +++ /dev/null @@ -1,14 +0,0 @@ -function categories( manifest ) { - manifest = manifest || []; - return manifest.reduce(function( map, category ) { - map[ category.slug ] = category; - map[ category.slug ].posts = category.posts.map(function( post ) { - return post.name; - }); - return map; - }, {} ); -} - -module.exports = { - categories: categories -}; diff --git a/lib/files.js b/lib/files.js index 33f2dbec..1382c4a9 100644 --- a/lib/files.js +++ b/lib/files.js @@ -1,17 +1,19 @@ -var _ = require( "underscore" ), - util = require( "./util" ); +"use strict"; + +var util = require( "./util" ); function Files() { var array = []; + // Using concat to flatten arguments array = array.concat.apply( array, arguments ); - array.__proto__ = Files.prototype; + Object.setPrototypeOf( array, Files.prototype ); return array; } Files.prototype = []; -_.extend( Files.prototype, { +Object.assign( Files.prototype, { concat: function() { return Files( Array.prototype.concat.apply( this, arguments ) ); }, @@ -30,30 +32,30 @@ _.extend( Files.prototype, { into: function( newSubStrs ) { var self = this; - return util.alwaysArray( newSubStrs ).map(function( newSubStr ) { + return util.alwaysArray( newSubStrs ).map( function( newSubStr ) { return self.rename.call( self, /^/, newSubStr ); - }).reduce( util.flatten, Files() ); + } ).reduce( util.flatten, Files() ); }, paths: function() { - return this.map(function( file ) { + return this.map( function( file ) { return file.path; - }); + } ); }, rename: function( regExp, newSubStr ) { - return this.map(function( file ) { + return this.map( function( file ) { return { path: file.path.replace( regExp, newSubStr ), data: file.data }; - }); + } ); }, tee: function( callback ) { callback( this.slice() ); return this; } -}); +} ); module.exports = Files; diff --git a/lib/jquery-ui.files.js b/lib/jquery-ui-files.js similarity index 53% rename from lib/jquery-ui.files.js rename to lib/jquery-ui-files.js index 6887330f..12a64507 100644 --- a/lib/jquery-ui.files.js +++ b/lib/jquery-ui-files.js @@ -1,20 +1,19 @@ -var commonFiles, componentFiles, flatten, stripBanner, testFiles, +"use strict"; + +var stripBanner, glob, noDirectory, banner = require( "./banner" ), - Files = require( "./files" ), - fs = require( "fs" ), - glob = require( "glob-whatev" ).glob, - JqueryUiFiles_1_9_0 = require( "./jquery-ui.files.1.9.0.js" ), - JqueryUiFiles_1_10_0 = require( "./jquery-ui.files.1.10.0.js" ), - JqueryUiFiles_1_11_0 = require( "./jquery-ui.files.1.11.0.js" ), - path = require( "path" ), - semver = require( "semver" ), + fs = require( "node:fs" ), + path = require( "node:path" ), sqwish = require( "sqwish" ), - UglifyJS = require( "uglify-js" ), + swc = require( "@swc/core" ), + swcOptions = require( "./swc-options" ), util = require( "./util" ), + Files = require( "./files" ), filesCache = {}; -flatten = util.flatten; stripBanner = util.stripBanner; +glob = util.glob; +noDirectory = util.noDirectory; function replaceVersion( data, version ) { return data.replace( /@VERSION/g, version ); @@ -22,7 +21,7 @@ function replaceVersion( data, version ) { function readFile( path, version ) { var data = fs.readFileSync( path ); - if ( (/(js|css)$/).test( path ) ) { + if ( ( /(js|css)$/ ).test( path ) ) { data = replaceVersion( data.toString( "utf8" ), version ); } return data; @@ -32,7 +31,7 @@ function readFile( path, version ) { * JqueryUiFiles */ function JqueryUiFiles( jqueryUi ) { - var cache; + var cache, files; this.cache = cache = filesCache[ jqueryUi.path ] = {}; this.cache.minified = {}; @@ -53,14 +52,30 @@ function JqueryUiFiles( jqueryUi ) { return path.relative( jqueryUi.path, filepath ); }; - // FIXME s/1.11.0pre/1.11.0 - if ( semver.gte( jqueryUi.pkg.version, "1.11.0pre" ) ) { - JqueryUiFiles_1_11_0.apply( this, arguments ); - } else if ( semver.gte( jqueryUi.pkg.version, "1.10.0" ) ) { - JqueryUiFiles_1_10_0.apply( this, arguments ); - } else { - JqueryUiFiles_1_9_0.apply( this, arguments ); - } + glob( jqueryUi.path + "!(.*|node_modules|build)" ) + .filter( noDirectory ) + .map( this.stripJqueryUiPath ) + .map( this.readFile ); + glob( jqueryUi.path + "!(.*|node_modules|build)/**" ) + .filter( noDirectory ) + .map( this.stripJqueryUiPath ) + .map( this.readFile ); + + this.componentFiles = Files( glob( jqueryUi.path + "ui/**/*.js" ) + .map( this.stripJqueryUiPath ) + .map( this.readFile ) ); + + // Convert {path:, data:} into {path: }. + files = this.cache; + this.cache = Object.keys( files ) + .reduce( function( _files, filepath ) { + _files[ filepath ] = files[ filepath ].data; + return _files; + }, {} ); + + this.baseThemeCss = { + data: this.get( "themes/base/theme.css" ) + }; } JqueryUiFiles.prototype = { @@ -68,16 +83,20 @@ JqueryUiFiles.prototype = { return this.cache[ filepath ]; }, - min: function( file ) { + min: function( file, options ) { var minified = this.cache.minified; + options = options || {}; - if ( !minified[ file.path ] ) { + if ( !minified[ file.path ] || options.skipCache ) { minified[ file.path ] = { path: file.path.replace( /\.([^.]*)$/, ".min.$1" ) }; - if ( (/.js$/i).test( file.path ) ) { - minified[ file.path ].data = UglifyJS.minify( file.data.toString( "utf8" ), { fromString: true } ).code; - } else if ( (/.css$/i).test( file.path ) ) { + if ( ( /\.js$/i ).test( file.path ) ) { + minified[ file.path ].data = swc.minifySync( + file.data.toString( "utf8" ), + swcOptions + ).code; + } else if ( ( /\.css$/i ).test( file.path ) ) { minified[ file.path ].data = sqwish.minify( file.data.toString( "utf8" ) ); } diff --git a/lib/jquery-ui-manifests.js b/lib/jquery-ui-manifests.js new file mode 100644 index 00000000..32e6f063 --- /dev/null +++ b/lib/jquery-ui-manifests.js @@ -0,0 +1,127 @@ +"use strict"; + +var categories, orderedComponents, + path = require( "node:path" ); + +categories = { + "Core": { + name: "Core", + description: "Various utilities and helpers", + order: 0 + }, + "Interactions": { + name: "Interactions", + description: "These add basic behaviors to any element and are used by many components below.", + order: 1 + }, + "Widgets": { + name: "Widgets", + description: "Full-featured UI Controls - each has a range of options and is fully themeable.", + order: 2 + }, + "Effects": { + name: "Effects", + description: "A rich effect API and ready to use effects.", + order: 3 + } +}; + +orderedComponents = "core widget mouse position".split( " " ); + +function createCategories( manifests ) { + var map = {}; + return manifests.reduce( function( arr, component ) { + if ( !map[ component.category ] ) { + var category = Object.assign( { + components: [] + }, categories[ component.category ] ); + map[ component.category ] = category; + arr.push( category ); + } + map[ component.category ].components.push( component ); + return arr; + }, [] ).sort( function( a, b ) { + return a.order - b.order; + } ); +} + +function stripExtension( string ) { + return string.replace( /\.[^.]*/, "" ); +} + +function flattenDependencies( tree, dependencies, ret ) { + ret = ret || []; + dependencies.filter( function( dependency ) { + return dependency !== "jquery"; + } ).forEach( function( dependency ) { + if ( ret.indexOf( dependency ) === -1 ) { + ret.push( dependency ); + flattenDependencies( tree, tree[ dependency ] || [], ret ); + } + } ); + return ret; +} + +function get( data, key ) { + var match = data.match( new RegExp( "\/\/>>" + key + ": (.*)" ) ); + return match && match[ 1 ]; +} + +function trim( string ) { + return string.trim(); +} + +function getDependencies( data ) { + var match = data.match( /define\(\ ?\[([^\]]*?)\]/ ); + if ( match === null ) { + return []; + } + return match[ 1 ].replace( /\/\/.+/g, "" ).replace( /"/g, "" ).split( "," ).map( trim ); +} + +function JqueryUiManifests() { + var dependenciesTree = {}; + this.manifests = this.files().componentFiles.filter( function( component ) { + return ( /ui\// ).test( component.path ); + } ).map( function( component ) { + var data = component.data; + return { + name: stripExtension( path.relative( "ui", component.path ) ), + title: get( data, "label" ), + description: get( data, "description" ), + docs: get( data, "docs" ), + category: get( data, "group" ), + dependencies: getDependencies( data ).map( function( dependency ) { + return path.relative( ".", dependency ); + } ) + }; + + // Workaround to get rid of files like `form-reset-mixin.js`. + } ).filter( function( component ) { + return component.title !== null; + + } ).sort( function( a, b ) { + var aOrder = orderedComponents.indexOf( a.name ), + bOrder = orderedComponents.indexOf( b.name ); + + // Precedence is 1st orderedComponents, 2nd alphabetical. + if ( aOrder >= 0 && bOrder >= 0 ) { + return aOrder - bOrder; + } else if ( aOrder >= 0 ) { + return -1; + } else if ( bOrder >= 0 ) { + return 1; + } else { + return a.name > b.name ? 1 : -1; + } + } ); + this.manifests.forEach( function( manifest ) { + dependenciesTree[ manifest.name ] = manifest.dependencies; + } ); + this.manifests.forEach( function( manifest ) { + manifest.dependencies = flattenDependencies( dependenciesTree, manifest.dependencies ); + } ); + this.categories = createCategories( this.manifests ); +} + +module.exports = JqueryUiManifests; diff --git a/lib/jquery-ui.files.1.10.0.js b/lib/jquery-ui.files.1.10.0.js deleted file mode 100644 index 2a315495..00000000 --- a/lib/jquery-ui.files.1.10.0.js +++ /dev/null @@ -1,78 +0,0 @@ -var commonFiles, componentFiles, flatten, isDirectory, noDirectory, optional, testFiles, - Docs = require( "./docs" ), - Files = require( "./files" ), - glob = require( "glob-whatev" ).glob, - util = require( "./util" ); - -flatten = util.flatten; -isDirectory = util.isDirectory; -noDirectory = util.noDirectory; -optional = util.optional; - -commonFiles = [ - "AUTHORS.txt", - "Gruntfile.js", - "jquery-*.js", - "MIT-LICENSE.txt", - "package.json", - "README.md", - "external/*", - "demos/demos.css", - "demos/images/*", - "themes/base/jquery.ui.all.css", - "themes/base/jquery.ui.base.css", - "themes/base/jquery.ui.theme.css", - "themes/base/images/*" -]; -componentFiles = [ - "*jquery.json", - "ui/*.js", - "themes/base/jquery*" -]; -testFiles = [ - "tests/**", - "ui/.jshintrc" -]; - -/** - * JqueryUiFiles 1.10.0 - */ -function JqueryUiFiles_1_10_0( jqueryUi ) { - var readFile, stripJqueryUiPath, - path = require( "path" ); - - readFile = this.readFile; - stripJqueryUiPath = this.stripJqueryUiPath; - - this.commonFiles = commonFiles.map(function( path ) { - return glob( jqueryUi.path + path ).filter( noDirectory ).map( stripJqueryUiPath ).map( readFile ); - }).reduce( flatten, Files() ); - - this.componentFiles = componentFiles.map(function( path ) { - return glob( jqueryUi.path + path ).filter( noDirectory ).map( stripJqueryUiPath ).map( readFile ); - }).reduce( flatten, Files() ); - - this.demoFiles = Files( glob( jqueryUi.path + "demos/*/**" ).filter( noDirectory ).map( stripJqueryUiPath ).map( readFile ) ); - - this.docFiles = Files( glob( jqueryUi.path + "docs/*" ).filter( noDirectory ).map( stripJqueryUiPath ).map( readFile ) ); - - this.i18nFiles = Files( glob( jqueryUi.path + "ui/i18n/*" ).map( stripJqueryUiPath ).map( readFile ) ); - - this.testFiles = testFiles.map(function( path ) { - return glob( jqueryUi.path + path ).filter( noDirectory ).map( stripJqueryUiPath ).map( readFile ); - }).reduce( flatten, Files() ); - - this.baseThemeFiles = Files( glob( jqueryUi.path + "themes/base/**" ).filter( noDirectory ).map( stripJqueryUiPath ).map( readFile ) ); - - this.jqueryCore = Files( glob( jqueryUi.path + "jquery-*" ).map( stripJqueryUiPath ).map( readFile ) ); - - // Auxiliary variables - this.baseThemeCss = this.get( "themes/base/jquery.ui.theme.css" ); - this.demoSubdirs = glob( jqueryUi.path + "demos/*" ).filter( isDirectory ).map(function( filepath ) { - // Get basename only with no trailing slash - return path.basename( filepath ).replace( /\/$/, "" ); - }).sort(); - this.docsCategories = Docs.categories( optional( jqueryUi.path + "docs/categories.json" ) ); -} - -module.exports = JqueryUiFiles_1_10_0; diff --git a/lib/jquery-ui.files.1.11.0.js b/lib/jquery-ui.files.1.11.0.js deleted file mode 100644 index 79ff8366..00000000 --- a/lib/jquery-ui.files.1.11.0.js +++ /dev/null @@ -1,78 +0,0 @@ -var commonFiles, componentFiles, flatten, isDirectory, noDirectory, optional, testFiles, - Docs = require( "./docs" ), - Files = require( "./files" ), - glob = require( "glob-whatev" ).glob, - util = require( "./util" ); - -flatten = util.flatten; -isDirectory = util.isDirectory; -noDirectory = util.noDirectory; -optional = util.optional; - -commonFiles = [ - "AUTHORS.txt", - "Gruntfile.js", - "jquery.js", - "MIT-LICENSE.txt", - "package.json", - "README.md", - "external/*", - "demos/demos.css", - "demos/images/*", - "themes/base/all.css", - "themes/base/base.css", - "themes/base/theme.css", - "themes/base/images/*" -]; -componentFiles = [ - "*jquery.json", - "ui/*.js", - "themes/base/*" -]; -testFiles = [ - "tests/**", - "ui/.jshintrc" -]; - -/** - * JqueryUiFiles 1.11.0 - */ -function JqueryUiFiles_1_11_0( jqueryUi ) { - var readFile, stripJqueryUiPath, - path = require( "path" ); - - readFile = this.readFile; - stripJqueryUiPath = this.stripJqueryUiPath; - - this.commonFiles = commonFiles.map(function( path ) { - return glob( jqueryUi.path + path ).filter( noDirectory ).map( stripJqueryUiPath ).map( readFile ); - }).reduce( flatten, Files() ); - - this.componentFiles = componentFiles.map(function( path ) { - return glob( jqueryUi.path + path ).filter( noDirectory ).map( stripJqueryUiPath ).map( readFile ); - }).reduce( flatten, Files() ); - - this.demoFiles = Files( glob( jqueryUi.path + "demos/*/**" ).filter( noDirectory ).map( stripJqueryUiPath ).map( readFile ) ); - - this.docFiles = Files( glob( jqueryUi.path + "docs/**" ).filter( noDirectory ).map( stripJqueryUiPath ).map( readFile ) ); - - this.i18nFiles = Files( glob( jqueryUi.path + "ui/i18n/*" ).map( stripJqueryUiPath ).map( readFile ) ); - - this.testFiles = testFiles.map(function( path ) { - return glob( jqueryUi.path + path ).filter( noDirectory ).map( stripJqueryUiPath ).map( readFile ); - }).reduce( flatten, Files() ); - - this.baseThemeFiles = Files( glob( jqueryUi.path + "themes/base/**" ).filter( noDirectory ).map( stripJqueryUiPath ).map( readFile ) ); - - this.jqueryCore = Files( glob( jqueryUi.path + "jquery.js" ).map( stripJqueryUiPath ).map( readFile ) ); - - // Auxiliary variables - this.baseThemeCss = this.get( "themes/base/theme.css" ); - this.demoSubdirs = glob( jqueryUi.path + "demos/*" ).filter( isDirectory ).map(function( filepath ) { - // Get basename only with no trailing slash - return path.basename( filepath ).replace( /\/$/, "" ); - }).sort(); - this.docsCategories = Docs.categories( optional( jqueryUi.path + "docs/categories.json" ) ); -} - -module.exports = JqueryUiFiles_1_11_0; diff --git a/lib/jquery-ui.files.1.9.0.js b/lib/jquery-ui.files.1.9.0.js deleted file mode 100644 index 94aa8e6a..00000000 --- a/lib/jquery-ui.files.1.9.0.js +++ /dev/null @@ -1,75 +0,0 @@ -var commonFiles, componentFiles, flatten, isDirectory, noDirectory, testFiles, - Files = require( "./files" ), - glob = require( "glob-whatev" ).glob, - util = require( "./util" ); - -flatten = util.flatten; -isDirectory = util.isDirectory; -noDirectory = util.noDirectory; - -commonFiles = [ - "AUTHORS.txt", - "grunt.js", - "jquery-*.js", - "MIT-LICENSE.txt", - "package.json", - "README.md", - "external/*", - "demos/demos.css", - "demos/images/*", - "themes/base/jquery.ui.all.css", - "themes/base/jquery.ui.base.css", - "themes/base/jquery.ui.theme.css", - "themes/base/images/*" -]; -componentFiles = [ - "*jquery.json", - "ui/*.js", - "themes/base/jquery*" -]; -testFiles = [ - "tests/**", - "ui/.jshintrc" -]; - -/** - * JqueryUiFiles 1.9.0 - */ -function JqueryUiFiles_1_9_0( jqueryUi ) { - var readFile, stripJqueryUiPath, - path = require( "path" ); - - readFile = this.readFile; - stripJqueryUiPath = this.stripJqueryUiPath; - - this.commonFiles = commonFiles.map(function( path ) { - return glob( jqueryUi.path + path ).filter( noDirectory ).map( stripJqueryUiPath ).map( readFile ); - }).reduce( flatten, Files() ); - - this.componentFiles = componentFiles.map(function( path ) { - return glob( jqueryUi.path + path ).filter( noDirectory ).map( stripJqueryUiPath ).map( readFile ); - }).reduce( flatten, Files() ); - - this.demoFiles = Files( glob( jqueryUi.path + "demos/*/**" ).filter( noDirectory ).map( stripJqueryUiPath ).map( readFile ) ); - - this.docFiles = Files( glob( jqueryUi.path + "docs/*" ).map( stripJqueryUiPath ).map( readFile ) ); - - this.i18nFiles = Files( glob( jqueryUi.path + "ui/i18n/*" ).map( stripJqueryUiPath ).map( readFile ) ); - - this.testFiles = testFiles.map(function( path ) { - return glob( jqueryUi.path + path ).filter( noDirectory ).map( stripJqueryUiPath ).map( readFile ); - }).reduce( flatten, Files() ); - - this.baseThemeFiles = Files( glob( jqueryUi.path + "themes/base/**" ).filter( noDirectory ).map( stripJqueryUiPath ).map( readFile ) ); - - this.jqueryCore = Files( glob( jqueryUi.path + "jquery-*" ).map( stripJqueryUiPath ).map( readFile ) ); - - // Auxiliary variables - this.baseThemeCss = this.get( "themes/base/jquery.ui.theme.css" ); - this.demoSubdirs = glob( jqueryUi.path + "demos/*" ).filter( isDirectory ).map(function( filepath ) { - // Get basename only with no trailing slash - return path.basename( filepath ).replace( /\/$/, "" ); - }).sort(); -} - -module.exports = JqueryUiFiles_1_9_0; diff --git a/lib/jquery-ui.js b/lib/jquery-ui.js index b2faec5b..cfaea06d 100644 --- a/lib/jquery-ui.js +++ b/lib/jquery-ui.js @@ -1,35 +1,9 @@ -var Builder, categories, orderedComponents, - _ = require( "underscore" ), - config = require( "./config" ), - fs = require( "fs" ), - glob = require( "glob-whatev" ).glob, - JqueryUiFiles = require( "./jquery-ui.files.js" ); - -categories = { - core: { - name: "UI Core", - description: "A required dependency, contains basic functions and initializers.", - order: 0 - }, - interaction: { - name: "Interactions", - description: "These add basic behaviors to any element and are used by many components below.", - order: 1 - }, - widget: { - name: "Widgets", - description: "Full-featured UI Controls - each has a range of options and is fully themeable.", - order: 2 - }, - effect: { - name: "Effects", - description: "A rich effect API and ready to use effects.", - order: 3 - } -}; - -orderedComponents = "core widget mouse position".split( " " ); +"use strict"; +var config = require( "./config" ), + fs = require( "node:fs" ), + JqueryUiFiles = require( "./jquery-ui-files.js" ), + JqueryUiManifests = require( "./jquery-ui-manifests.js" ); /** * JqueryUi @@ -38,18 +12,18 @@ function JqueryUi( path, options ) { options = options || {}; this.dependsOn = options.dependsOn; this.stable = options.stable; - this.label = this.stable ? "Stable" : "Legacy"; + this.label = options.label; + // 1: Always with a trailing slash - this.path = path.replace( /\/*$/, "/" ) /* 1 */; + this.path = path.replace( /\/*$/, "/" ); this.pkg = JSON.parse( fs.readFileSync( path + "/package.json" ) ); - this.manifests = glob( this.path + "/*.jquery.json" ).map(function( filepath ) { - return JSON.parse( fs.readFileSync( filepath ) ); - }); + + JqueryUiManifests.apply( this, arguments ); } JqueryUi.all = function() { if ( !JqueryUi._all ) { - JqueryUi._all = config().jqueryUi.map(function( jqueryUi ) { + JqueryUi._all = config().jqueryUi.map( function( jqueryUi ) { var path = __dirname + "/../jquery-ui/" + jqueryUi.ref + "/"; if ( !fs.existsSync( path ) ) { throw new Error( "Missing ./" + require( "path" ).relative( __dirname, path ) + " folder. Run `grunt prepare` first, or fix your config file." ); @@ -58,15 +32,15 @@ JqueryUi.all = function() { throw new Error( "Invalid ./" + require( "path" ).relative( __dirname, path ) + " folder. Run `grunt prepare` first, or fix your config file." ); } return new JqueryUi( path, jqueryUi ); - }); + } ); } return JqueryUi._all; }; JqueryUi.getStable = function() { - var match = JqueryUi.all().filter(function( jqueryUi ) { + var match = JqueryUi.all().filter( function( jqueryUi ) { return jqueryUi.stable; - }); + } ); if ( !match.length ) { throw new Error( "No stable jqueryUi has been defined. Check your config file." ); } @@ -77,9 +51,9 @@ JqueryUi.find = function( version ) { if ( !version ) { throw new Error( "Invalid version argument: " + version ); } - var match = JqueryUi.all().filter(function( jqueryUi ) { + var match = JqueryUi.all().filter( function( jqueryUi ) { return jqueryUi.pkg.version === version; - }); + } ); if ( !match.length ) { throw new Error( "Didn't find a jqueryUi for version: " + version ); } @@ -87,57 +61,8 @@ JqueryUi.find = function( version ) { }; JqueryUi.prototype = { - categories: function() { - if ( !this._categories ) { - var map = {}; - this._categories = this.components().reduce(function( arr, component ) { - if ( !map[ component.category ] ) { - var category = _.extend({ - components: [] - }, categories[component.category]); - map[ component.category ] = category; - arr.push( category ); - } - map[ component.category ].components.push( component ); - return arr; - }, [] ).sort(function( a, b ) { - return a.order - b.order; - }); - } - return this._categories; - }, - components: function() { - if ( !this._components ) { - this._components = this.manifests.map(function( manifest ) { - return { - name: manifest.name.replace( /ui\./, "" ), - title: manifest.title.replace( /^jQuery UI /, ""), - description: manifest.description, - docs: manifest.docs, - category: manifest.category, - dependencies: Object.keys( manifest.dependencies ).filter(function( dependency ) { - return dependency !== "jquery"; - }).map(function( dependency ) { - return dependency.replace( /ui\./, "" ); - }) - }; - }).sort(function( a, b ) { - var aOrder = orderedComponents.indexOf( a.name ), - bOrder = orderedComponents.indexOf( b.name ); - // Precedence is 1st orderedComponents, 2nd alphabetical. - if ( aOrder >= 0 && bOrder >= 0 ) { - return aOrder - bOrder; - } else if ( aOrder >= 0 ) { - return -1; - } else if ( bOrder >= 0 ) { - return 1; - } else { - return a.name > b.name ? 1 : -1; - } - }); - } - return this._components; + return this.manifests; }, files: function() { diff --git a/lib/package-themes.js b/lib/package-themes.js new file mode 100644 index 00000000..d398de70 --- /dev/null +++ b/lib/package-themes.js @@ -0,0 +1,83 @@ +"use strict"; + +var async = require( "async" ); +var extend = require( "util" )._extend; +var banner = require( "./banner" ); +var sqwish = require( "sqwish" ); +var Package = require( "./package" ); +var path = require( "node:path" ); +var ThemeGallery = require( "./themeroller-themegallery" ); + +function stripBanner( data ) { + if ( data instanceof Buffer ) { + data = data.toString( "utf8" ); + } + return data.replace( /^\s*\/\*[\s\S]*?\*\/\s*/g, "" ); +} + +function PackageThemes( files, runtime ) { + this.themeGallery = ThemeGallery( runtime.jqueryUi ); + if ( !runtime.themeVars ) { + runtime.themeVars = this.themeGallery[ 0 ].vars; + } + Package.apply( this, arguments ); +} + +extend( PackageThemes.prototype, { + "AUTHORS.txt": Package.prototype[ "AUTHORS.txt" ], + "LICENSE.txt": Package.prototype[ "LICENSE.txt" ], + "images": Package.prototype.images, + "jquery-ui.css": Package.prototype[ "jquery-ui.css" ], + "jquery-ui.structure.css": Package.prototype[ "jquery-ui.structure.css" ], + "jquery-ui.theme.css": Package.prototype[ "jquery-ui.theme.css" ], + "jquery-ui.min.css": Package.prototype[ "jquery-ui.min.css" ], + "jquery-ui.structure.min.css": Package.prototype[ "jquery-ui.structure.min.css" ], + "jquery-ui.theme.min.css": Package.prototype[ "jquery-ui.theme.min.css" ], + + "themes": function( callback ) { + var files = {}; + var structureCssFileNames = this.structureCssFileNames; + var themeCssFileNames = this.themeCssFileNames; + var pkgJson = this.pkgJson; + var themeGallery = this.themeGallery; + this.structureCss.promise.then( function( structureCss ) { + async.mapSeries( themeGallery, function( theme, callback ) { + var themeCss = theme.css(); + + files[ path.join( theme.folderName(), "theme.css" ) ] = themeCss; + + var _banner = banner( pkgJson, structureCssFileNames.concat( themeCssFileNames ), { + customThemeUrl: theme.url() + } ); + var _minBanner = banner( pkgJson, structureCssFileNames.concat( themeCssFileNames ), { + minify: true, + customThemeUrl: theme.url() + } ); + var allCss = structureCss + stripBanner( themeCss ); + + // Bundle CSS (and minified) + files[ path.join( theme.folderName(), "jquery-ui.css" ) ] = _banner + allCss; + files[ path.join( theme.folderName(), "jquery-ui.min.css" ) ] = _minBanner + sqwish.minify( allCss ); + + // Custom theme image files + theme.generateImages( function( error, imageFiles ) { + if ( error ) { + return callback( error, null ); + } + for ( const [ imagePath, imageData ] of Object.entries( imageFiles ) ) { + files[ path.join( theme.folderName(), "images", imagePath ) ] = imageData; + } + callback(); + } ); + }, function( error ) { + if ( error ) { + console.log( "mapSeries( themeGallery ) failed", error ); + return callback( error ); + } + callback( null, files ); + } ); + } ); + } +} ); + +module.exports = PackageThemes; diff --git a/lib/package.js b/lib/package.js new file mode 100644 index 00000000..0cf03dc8 --- /dev/null +++ b/lib/package.js @@ -0,0 +1,393 @@ +"use strict"; + +var indexTemplate, + amdBuilder = require( "builder-amd" ), + banner = require( "./banner" ), + extend = require( "util" )._extend, + fs = require( "node:fs" ), + handlebars = require( "handlebars" ), + jqueryCssBuilder = require( "builder-jquery-css" ), + path = require( "node:path" ), + sqwish = require( "sqwish" ), + ThemeRoller = require( "./themeroller" ), + semver = require( "semver" ), + swc = require( "@swc/core" ), + swcOptions = require( "./swc-options" ); + +indexTemplate = handlebars.compile( fs.readFileSync( __dirname + "/../template/zip/index.html", "utf8" ) ); + +function getJsBundleIntro( version ) { + if ( semver.lt( version, "1.13.0-a" ) ) { + return "(function( factory ) {\n" + + " if ( typeof define === \"function\" && define.amd ) {\n" + + "\n" + + " // AMD. Register as an anonymous module.\n" + + " define([ \"jquery\" ], factory );\n" + + " } else {\n" + + "\n" + + " // Browser globals\n" + + " factory( jQuery );\n" + + " }\n" + + "}(function( $ ) {"; + } else { + return "( function( factory ) {\n" + + " \"use strict\";\n" + + "\n" + + " if ( typeof define === \"function\" && define.amd ) {\n" + + "\n" + + " // AMD. Register as an anonymous module.\n" + + " define( [ \"jquery\" ], factory );\n" + + " } else {\n" + + "\n" + + " // Browser globals\n" + + " factory( jQuery );\n" + + " }\n" + + "} )( function( $ ) {\n" + + "\"use strict\";\n"; + } +} + +function getJsBundleOutro( version ) { + if ( semver.lt( version, "1.13.0-a" ) ) { + return "}));"; + } else { + return "} );"; + } +} + +// Switch to native Promise.withResolvers() once Node.js 22 is our baseline. +function getPromiseWithResolvers() { + let resolve, reject; + const promise = new Promise( ( res, rej ) => { + resolve = res; + reject = rej; + } ); + return { promise, resolve, reject }; +} + +function camelCase( input ) { + return input.toLowerCase().replace( /[-/](.)/g, function( match, group1 ) { + return group1.toUpperCase(); + } ); +} + +function stripBanner( data ) { + if ( data instanceof Buffer ) { + data = data.toString( "utf8" ); + } + return data.replace( /^\s*\/\*[\s\S]*?\*\/\s*/g, "" ); +} + +/** + * scope( css, scope ) + * - css [ String ]: CSS content. + * - scopeString [ String ]: The scope-string that will be added before each css ".ui*" selector. + * + * Returns the scoped css. + */ +function scope( css, scopeString ) { + return css.replace( /(\.ui[^\n,}]*)/g, scopeString + " $1" ); +} + +function Package( files, runtime ) { + this.jsBundle = getPromiseWithResolvers(); + this.jsFileNames = runtime.components.map( function( component ) { + return component + ".js"; + } ); + this.pkgJson = JSON.parse( files[ "package.json" ].toString( "utf-8" ) ); + this.structureCss = getPromiseWithResolvers(); + this.structureCssFileNames = []; + this.structureMinCss = getPromiseWithResolvers(); + this.themeCss = getPromiseWithResolvers(); + this.themeCssFileNames = []; + this.themeMinCss = getPromiseWithResolvers(); + this.zipBasedir = "jquery-ui-" + this.pkgJson.version + ".custom"; + this.zipFilename = this.zipBasedir + ".zip"; +} + +extend( Package.prototype, { + "AUTHORS.txt": "AUTHORS.txt", + "LICENSE.txt": "LICENSE.txt", + "package.json": "package.json", + "external/jquery/jquery.js": function() { + if ( !this.runtime.components.length ) { + return null; + } + return this.files[ "external/jquery/jquery.js" ]; + }, + + "images": function( callback ) { + var self = this; + + this.themeCss.promise.then( function( css ) { + if ( css === null ) { + return callback( null, null ); + } + self.themeroller.generateImages( callback ); + } ).catch( callback ); + }, + + "index.html": function() { + var version = this.pkgJson.version; + if ( !this.runtime.components.length ) { + return null; + } + return indexTemplate( { + ui: this.runtime.components.reduce( function( sum, component ) { + sum[ component.replace( /^.+\//, "" ) ] = true; + return sum; + }, {} ), + version: version + } ); + }, + + "jquery-ui.css": function( callback ) { + var self = this, + pkgJson = this.pkgJson, + structureCssFileNames = this.structureCssFileNames, + themeCssFileNames = this.themeCssFileNames; + + Promise + .all( [ this.structureCss.promise, this.themeCss.promise ] ) + .then( function( [ structureCss, themeCss ] ) { + var _banner = banner( pkgJson, structureCssFileNames.concat( themeCssFileNames ), { + customThemeUrl: self.customThemeUrl + } ); + themeCss = themeCss ? "\n" + themeCss : ""; + callback( null, _banner + structureCss + themeCss ); + } ) + .catch( callback ); + }, + + "jquery-ui.js": function( callback ) { + var jsBundle = this.jsBundle, + jsFileNames = this.jsFileNames, + pkgJson = this.pkgJson; + + if ( !this.runtime.components.length ) { + return callback( null, null ); + } + + amdBuilder( this.files, { + appDir: "ui", + exclude: [ "jquery" ], + include: this.runtime.components, + onBuildWrite: ( id, path, contents ) => { + var name; + + if ( id === "jquery" ) { + return contents; + } + + name = camelCase( id.replace( /ui\//, "" ).replace( /\.js$/, "" ) ); + + if ( semver.lt( this.pkgJson.version, "1.13.0-a" ) ) { + return contents + + // Remove UMD wrapper. + .replace( /\( ?function\( factory[\s\S]*?\( ?function\( [^\)]* \) \{/, "" ) + .replace( /\} ?\) ?\);\s*?$/, "" ) + + // Replace return exports for var =. + .replace( /\nreturn/, "\nvar " + name + " =" ); + } else { + return contents + + // Remove UMD wrappers of UI & jQuery Color. + .replace( /\( ?function\( ?(?:root, ?)?factory\b[\s\S]*?\( ?(?:this, ?)?function\( ?[^\)]* ?\) ?\{(?:\s*"use strict";\n)?/, "" ) + .replace( /\} ?\);\s*?$/, "" ) + + // Replace return exports for var =. + .replace( /\nreturn/, "\nvar " + name + " =" ); + } + }, + optimize: "none", + useStrict: semver.gte( this.pkgJson.version, "1.13.0-a" ), + paths: { + jquery: "../external/jquery/jquery" + }, + wrap: { + start: getJsBundleIntro( this.pkgJson.version ), + end: getJsBundleOutro( this.pkgJson.version ) + } + }, function( error, js ) { + var _banner; + if ( error ) { + jsBundle.reject( error ); + return callback( error ); + } + + // Remove leftover define created during rjs build + js = js.replace( /define\(".*/, "" ); + + jsBundle.resolve( js ); + _banner = banner( pkgJson, jsFileNames ); + callback( null, _banner + js ); + } ); + }, + + "jquery-ui.structure.css": function( callback ) { + var self = this, + structureCssFileNames = this.structureCssFileNames, + runtime = this.runtime, + structureCss = this.structureCss, + themeCss = this.themeCss; + + if ( !this.runtime.components.length ) { + structureCss.resolve( "" ); + return callback( null, null ); + } + + jqueryCssBuilder( this.files, "structure", { + appDir: "ui", + include: this.runtime.components, + onCssBuildWrite: function( _path, data ) { + if ( data === undefined ) { + throw new Error( "onCssBuildWrite failed (data is undefined) for path " + _path ); + } + structureCssFileNames.push( path.basename( _path ) ); + return stripBanner( data ); + }, + paths: { + jquery: "../external/jquery/jquery" + } + }, function( error, css ) { + if ( error ) { + structureCss.reject( error ); + return callback( error ); + } + + // Scope all rules due to specificity issue with tabs (see #87) + if ( runtime.scope ) { + css = scope( css, runtime.scope ); + } + + structureCss.resolve( css ); + + // Add Banner + themeCss.promise.then( function() { + var banner = self.files[ "themes/base/theme.css" ] + .replace( /\*\/[\s\S]*/, "*/" ) + .replace( /\n.*\n.*themeroller.*/, "" ); + + banner = banner ? banner + "\n" : ""; + callback( null, banner + css ); + } ); + } ); + }, + + "jquery-ui.theme.css": function() { + var css; + + if ( this.runtime.themeVars === null ) { + this.themeCss.resolve( null ); + return null; + } + + this.themeCssFileNames.push( "theme.css" ); + + if ( this.runtime.jqueryUi ) { + this.themeroller = new ThemeRoller( { + vars: this.runtime.themeVars, + jqueryUi: this.runtime.jqueryUi + } ); + } else if ( this.runtime.jQueryUiVersion ) { + this.themeroller = new ThemeRoller( { + vars: this.runtime.themeVars, + version: this.runtime.jQueryUiVersion + } ); + } else { + this.themeroller = new ThemeRoller( { + vars: this.runtime.themeVars + } ); + } + this.customThemeUrl = this.themeroller.url(); + css = this.themeroller.css(); + + if ( this.runtime.scope ) { + css = scope( css, this.runtime.scope ); + } + + this.themeCss.resolve( stripBanner( css ) ); + + return css; + }, + + "jquery-ui.min.css": function( callback ) { + var self = this, + pkgJson = this.pkgJson, + structureCssFileNames = this.structureCssFileNames, + themeCssFileNames = this.themeCssFileNames; + + Promise + .all( [ this.structureMinCss.promise, this.themeMinCss.promise ] ) + .then( function( [ structureMinCss, themeMinCss ] ) { + var _banner = banner( pkgJson, structureCssFileNames.concat( themeCssFileNames ), { + customThemeUrl: self.customThemeUrl, + minify: true + } ); + themeMinCss = themeMinCss || ""; + callback( null, _banner + structureMinCss + themeMinCss ); + } ) + .catch( callback ); + }, + + "jquery-ui.min.js": function( callback ) { + var jsFileNames = this.jsFileNames, + pkgJson = this.pkgJson; + + if ( !this.runtime.components.length ) { + return callback( null, null ); + } + + this.jsBundle.promise.then( function( js ) { + var _banner = banner( pkgJson, jsFileNames, { minify: true } ); + var minJs = swc.minifySync( js, swcOptions ).code; + callback( null, _banner + minJs ); + } ).catch( callback ); + }, + + "jquery-ui.structure.min.css": function( callback ) { + var pkgJson = this.pkgJson, + structureMinCss = this.structureMinCss; + + if ( !this.runtime.components.length ) { + structureMinCss.resolve(); + return callback( null, null ); + } + + this.structureCss.promise.then( function( css ) { + var _banner = banner( pkgJson, null, { minify: true } ), + minCss = sqwish.minify( css ); + structureMinCss.resolve( minCss ); + callback( null, _banner + minCss ); + }, function( error ) { + structureMinCss.reject( error ); + callback( error ); + } ); + }, + + "jquery-ui.theme.min.css": function( callback ) { + var pkgJson = this.pkgJson, + themeMinCss = this.themeMinCss; + + this.themeCss.promise.then( function( css ) { + var _banner, minCss; + + if ( css === null ) { + themeMinCss.resolve( null ); + return callback( null, null ); + } + + _banner = banner( pkgJson, null, { minify: true } ); + minCss = sqwish.minify( css ); + themeMinCss.resolve( minCss ); + callback( null, _banner + minCss ); + }, function( error ) { + themeMinCss.reject( error ); + callback( error ); + } ); + } +} ); + +module.exports = Package; diff --git a/lib/packer.js b/lib/packer.js deleted file mode 100644 index 638f152b..00000000 --- a/lib/packer.js +++ /dev/null @@ -1,285 +0,0 @@ -var indexTemplate, themeImagesCache, - async = require( "async" ), - banner = require( "./banner" ), - Files = require( "./files" ), - fs = require( "fs" ), - handlebars = require( "handlebars" ), - JqueryUi = require( "./jquery-ui" ), - logger = require( "simple-log" ).init( "download.jqueryui.com" ), - path = require( "path" ), - semver = require( "semver" ), - sqwish = require( "sqwish" ), - util = require( "./util" ); - -indexTemplate = handlebars.compile( fs.readFileSync( __dirname + "/../template/zip/index.html", "utf8" ) ); -themeImagesCache = {}; - -function stripThemeImport( src ) { - if ( src instanceof Buffer ) { - src = src.toString( "utf8" ); - } - return src.replace( /@import "jquery\.ui\.theme\.css";\n/, "" ); -} - - -/** - * Packer( builder, theme, options ) - * - builder [ instanceof Builder ]: jQuery UI builder object. - * - theme [ instanceof ThemeRoller ]: theme object. - * - options: details below. - * - * options: - * - addTests [ Boolean ]: Include test files on package. Default is false. - * - bundleSuffix [ String ]: Change bundle filename suffix. Default is ".custom". - * - scope [ String ]: Insert a scope string on the css selectors. - * - skipDocs [ Boolean ]: Skip doc files on package. Default is false. - * - skipTheme [ Boolean ]: Skip theme files on package. Default is false. - */ -function Packer( builder, theme, options ) { - this.options = options = options || {}; - if ( typeof options.bundleSuffix === "undefined" ) { - options.bundleSuffix = ".custom"; - } - - this.basedir = "jquery-ui-" + builder.jqueryUi.pkg.version + options.bundleSuffix; - this.builder = builder; - this.theme = theme; - - if ( options.skipTheme ) { - this.theme = new ( require( "./themeroller" ) )({ vars: null }); - } -} - -// TODO shall we move it to themeroller.image.js? -Packer.cacheThemeGalleryImages = function() { - async.forEachSeries( require( "./themeroller.themegallery" )(), function( theme, callback ) { - theme.generateImages(function( err, imageFiles ) { - if ( err ) { - logger.error( "Caching theme images: " + ( err.stack || err ) ); - } else { - themeImagesCache[ theme.name ] = imageFiles; - logger.log( "Theme \"" + theme.name + "\" image files cached" ); - } - callback(); - }); - }); -}; - -Packer.prototype = { - /** - * Generates a build array [ , ... ], where - * build-item = { - * path: String:package destination filepath, - * data: String/Buffer:the content itself - * } - */ - pack: function( callback ) { - var build, - add = function( file ) { - if ( arguments.length === 2 ) { - file = { - path: arguments[ 0 ], - data: arguments[ 1 ] - }; - } - output.push({ - path: path.join( basedir, file.path ), - data: file.data - }); - }, - basedir = this.basedir, - builder = this.builder, - options = this.options, - output = [], - theme = this.theme; - - function _build( callback ) { - builder.build(function( error, _build ) { - if ( error ) { - return callback( error ); - } - build = _build; - callback(); - }); - } - - function pack( callback ) { - // Common and component files (includes baseThemeFiles) - build.commonFiles.into( "development-bundle/" ).forEach( add ); - build.componentFiles.into( "development-bundle/" ).forEach( add ); - - build.componentMinFiles - .rename( /^ui/, "ui/minified" ) - .into( "development-bundle/" ).forEach( add ); - - // Base theme (baseThemeFiles have been included by componentFiles) - build.baseThemeMinFiles - .rename( /^themes\/base/, "themes/base/minified" ) - .into( "development-bundle/" ).forEach( add ); - - build.baseThemeImages - .rename( /^themes\/base\/images/, "themes/base/minified/images" ) - .into( "development-bundle/" ).forEach( add ); - - // I18n - build.i18nFiles.into( "development-bundle/" ).forEach( add ); - build.i18nMinFiles - .rename( /^ui\/i18n/, "ui/minified/i18n" ) - .into( "development-bundle/" ).forEach( add ); - build.bundleI18n.into( "development-bundle/ui/i18n/" ).forEach( add ); - build.bundleI18nMin.into( "development-bundle/ui/minified/i18n/" ).forEach( add ); - - // Bundle JS (and minified) - build.bundleJs - .rename( /^jquery-ui/, "jquery-ui" + options.bundleSuffix ) - .into( "development-bundle/ui/" ).forEach( add ); - - build.bundleJs - .rename( /^jquery-ui/, "jquery-ui-" + build.pkg.version + options.bundleSuffix ) - .into( "js/" ).forEach( add ); - - build.bundleJsMin - .rename( /^jquery-ui/, "jquery-ui" + options.bundleSuffix ) - .into( "development-bundle/ui/minified/" ).forEach( add ); - - build.bundleJsMin - .rename( /^jquery-ui/, "jquery-ui-" + build.pkg.version + options.bundleSuffix ) - .into( "js/" ).forEach( add ); - - // Bundle CSS (and minified) - build.bundleCss( build.baseTheme ).into( "development-bundle/themes/base/" ).forEach( add ); - build.bundleCssMin( build.baseThemeMin ).into( "development-bundle/themes/base/minified/" ).forEach( add ); - if ( !options.skipTheme ) { - build.bundleCss( theme ) - .tee(function( clone ) { - clone.into( "development-bundle/themes/" + theme.folderName() + "/" ).forEach( add ); - }) - .rename( /^jquery-ui/, "jquery-ui-" + build.pkg.version + options.bundleSuffix ) - .into( "css/" + theme.folderName() + "/" ).forEach( add ); - - build.bundleCssMin( theme ) - .tee(function( clone ) { - clone.into( "development-bundle/themes/" + theme.folderName() + "/minified/" ).forEach( add ); - }) - .rename( /^jquery-ui/, "jquery-ui-" + build.pkg.version + options.bundleSuffix ) - .into( "css/" + theme.folderName() + "/" ).forEach( add ); - } - - // Demo files - build.demoFiles.into( "development-bundle/" ).forEach( add ); - - // Doc files - if ( !options.skipDocs ) { - if ( !build.docFiles ) { - throw new Error( "Missing docFiles" ); - } - build.docFiles.into( "development-bundle/" ).forEach( add ); - } - - // Test files - if ( options.addTests ) { - build.testFiles.into( "development-bundle/" ).forEach( add ); - } - - // Ad hoc - build.jqueryCore.into( "js/" ).forEach( add ); - add( "index.html", indexTemplate({ - bundleCss: "jquery-ui-" + build.pkg.version + options.bundleSuffix + ".css", - bundleJs: "jquery-ui-" + build.pkg.version + options.bundleSuffix + ".js", - jqueryCore: build.jqueryCore[ 0 ].path, - ui: build.components.reduce(function( sum, component ) { - sum[ component ] = true; - return sum; - }, {}), - themeFolderName: theme.folderName(), - version: build.pkg.version - })); - - // Custom theme files - if ( !options.skipTheme ) { - build.baseThemeExceptThemeOrImages.forEach(function( file ) { - if ( theme.isNull && (/all.css/).test( file.path ) ) { - add( "development-bundle/themes/" + theme.folderName() + "/" + path.basename( file.path ), stripThemeImport( file.data ) ); - } else { - add( file.path.replace( "themes/base", "development-bundle/themes/" + theme.folderName() ), options.scope ? util.scope( file.data.toString( "utf8" ), options.scope ) : file.data ); - } - }); - // minified custom theme - build.baseThemeMinFiles.filter(function( file ) { - return !(/theme\W/).test( file.path ); - }).map(function( file ) { - return options.scope ? { path: file.path, data: util.scope( file.data, options.scope ) } : file; - }).rename( /^themes\/base/, "themes/" + theme.folderName() + "/minified" ).into( "development-bundle/" ).forEach( add ); - } - if ( !theme.isNull ) { - // FIXME s/1.11.0pre/1.11.0 - if ( semver.gte( build.pkg.version, "1.11.0pre" ) ) { - add( "development-bundle/themes/" + theme.folderName() + "/theme.css", theme.css() ); - add( "development-bundle/themes/" + theme.folderName() + "/minified/theme.min.css", banner( build.pkg, null, { minify: true } ) + sqwish.minify( util.stripBanner({ data: theme.css() }) ) ); - } else { - add( "development-bundle/themes/" + theme.folderName() + "/jquery.ui.theme.css", theme.css() ); - add( "development-bundle/themes/" + theme.folderName() + "/minified/jquery.ui.theme.min.css", banner( build.pkg, null, { minify: true } ) + sqwish.minify( util.stripBanner({ data: theme.css() }) ) ); - } - } - - // Custom theme image files - if ( theme.isNull ) { - callback( null, output ); - } - else { - async.series([ - function( callback ) { - var themeImages = Files(); - if ( semver.gte( build.pkg.version, "1.10.0" ) ) { - themeImages.push({ - path: "animated-overlay.gif", - data: build.get( "themes/base/images/animated-overlay.gif" ).data - }); - } - if ( themeImagesCache[ theme.name ] ) { - // Cached - callback( null, themeImages.concat( themeImagesCache[ theme.name ] ) ); - } else { - // Not cached, fetch them - theme.generateImages(function( err, imageFiles ) { - if ( err ) { - callback( err, null ); - return; - } - callback( null, themeImages.concat( imageFiles ) ); - }); - } - } - ], function( err, themeImages ) { - if ( err ) { - callback( err, null ); - } - themeImages[ 0 ].into( [ "css/" + theme.folderName() + "/images/", "development-bundle/themes/" + theme.folderName() + "/images/", "development-bundle/themes/" + theme.folderName() + "/minified/images/" ] ).forEach( add ); - callback( null, output ); - }); - } - } - - async.series([ - _build, - pack - ], function( error ) { - callback( error, output ); - }); - }, - - filename: function() { - return this.basedir + ".zip"; - }, - - zipTo: function( target, callback ) { - this.pack(function( err, files ) { - if ( err ) { - return callback( err, null ); - } - util.createZip( files, target, callback ); - }); - } -}; - -module.exports = Packer; diff --git a/lib/rjs.js b/lib/rjs.js deleted file mode 100644 index 74eb34ec..00000000 --- a/lib/rjs.js +++ /dev/null @@ -1,182 +0,0 @@ -var fileApi, files, mutex, prim, rjs, - _ = require( "underscore" ), - fs = require( "fs" ), - logger = require( "simple-log" ).init( "download.jqueryui.com" ), - 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 ] = { - path: dest, - data: files[ src ].data - }; - 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 ].data.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 ] = { - path: _path, - data: data - }; - }, - - saveUtf8File: function( fileName, fileContents ) { - fileApi.saveFile( fileName, fileContents ); - } -}; - -rjs = function( attributes, callback ) { - var config, localCallback; - - if ( mutex ) { - throw new Error( "Concurrent calls not supported" ); - } - mutex = true; - localCallback = function( error, results ) { - mutex = false; - callback( error, results ); - }; - - attributes = attributes || {}; - if ( !( "files" in attributes ) ) { - throw new Error( "missing attributes.files" ); - } - if ( !( "config" in attributes ) ) { - throw new Error( "missing attributes.config" ); - } - - files = _.clone( attributes.files.cache ); - - requirejs.define( "node/file", [ "prim" ], function( _prim ) { - prim = _prim; - return fileApi; - }); - - requirejs.define( "node/print", [], function() { - return function print( msg ) { - logger.log( msg ); - if ( msg.substring( 0, 5 ) === "Error" ) { - throw new Error( msg ); - } - }; - }); - - config = _.extend( {}, attributes.config, { - dir: "dist/build", - optimize: "none", - optimizeCss: "none", - logLevel: 2 - }); - - requirejs.optimize( config, function() { - var contents, - fileName = path.resolve( "/" + config.dir, config.modules[ 0 ].name ) + ".js"; - - // Remove leftover define created during rjs build - contents = fileApi.readFile( fileName ).replace( /define\(".*/, "" ); - - localCallback( null, contents ); - }, localCallback ); -}; - -module.exports = rjs; diff --git a/lib/swc-options.js b/lib/swc-options.js new file mode 100644 index 00000000..3c1963c3 --- /dev/null +++ b/lib/swc-options.js @@ -0,0 +1,18 @@ +"use strict"; + +module.exports = { + compress: { + ecma: 5, + hoist_funs: false, + loops: false + }, + format: { + ecma: 5, + asciiOnly: true, + comments: false + }, + inlineSourcesContent: false, + mangle: true, + module: false, + sourceMap: false +}; diff --git a/lib/themeroller.colors.js b/lib/themeroller-colors.js similarity index 99% rename from lib/themeroller.colors.js rename to lib/themeroller-colors.js index 538a6f1e..61f335b4 100644 --- a/lib/themeroller.colors.js +++ b/lib/themeroller-colors.js @@ -1,3 +1,5 @@ +"use strict"; + module.exports = [ "aliceblue", "antiquewhite", diff --git a/lib/themeroller.defaults.js b/lib/themeroller-defaults.js similarity index 99% rename from lib/themeroller.defaults.js rename to lib/themeroller-defaults.js index bf3dfd97..96fff88f 100644 --- a/lib/themeroller.defaults.js +++ b/lib/themeroller-defaults.js @@ -1,3 +1,5 @@ +"use strict"; + module.exports = { "bgColorDefault": "e6e6e6", "borderColorDefault": "d3d3d3", diff --git a/lib/themeroller.image.js b/lib/themeroller-image.js similarity index 61% rename from lib/themeroller.image.js rename to lib/themeroller-image.js index 3b4927ad..a9e3a78b 100644 --- a/lib/themeroller.image.js +++ b/lib/themeroller-image.js @@ -1,19 +1,39 @@ -var cache, imVersion, - _ = require( "underscore" ), - async = require( "async" ), - Cache = require( "./cache" ), - im = require( "gm" ).subClass({ imageMagick: true }), - semver = require( "semver" ), - dimensionLimit = 3000, - namedColors = require( "./themeroller.colors.js" ); +"use strict"; -cache = new Cache( "Image Cache" ); +const path = require( "node:path" ); +const async = require( "async" ); +const spawn = require( "cross-spawn" ); +const Cache = require( "./cache" ); +const semver = require( "semver" ); +const dimensionLimit = 3000; +const namedColors = require( "./themeroller-colors" ); + +const cache = new Cache( "Image Cache" ); + +function processImageMagick( args, callback ) { + const proc = spawn( "magick", args ); + + const stdoutBuffers = []; + const stderrBuffers = []; + + proc.stdout.on( "data", data => stdoutBuffers.push( data ) ); + proc.stderr.on( "data", data => stderrBuffers.push( data ) ); + + proc.on( "close", code => { + if ( code !== 0 ) { + return callback( new Error( `magick process exited with code ${ code }: ${ Buffer.concat( stderrBuffers ).toString() }` ) ); + } + callback( null, Buffer.concat( stdoutBuffers ) ); + } ); + + proc.on( "error", callback ); +} function expandColor( color ) { if ( color.length === 3 && /^[0-9a-f]+$/i.test( color ) ) { - return [ 0, 0, 1, 1, 2, 2 ].map(function( i ) { + return [ 0, 0, 1, 1, 2, 2 ].map( function( i ) { return color[ i ]; - }).join( "" ); + } ).join( "" ); } return color; } @@ -25,49 +45,13 @@ function hashColor( color ) { return color; } -// I don't know if there's a better solution, but without the below conversion to Buffer we're not able to use it. -function stream2Buffer( callback ) { - return function( err, stdin, stderr ) { - if ( err ) { - return callback( err ); - } - var chunks = [], - dataLen = 0; - err = ""; - - stdin.on( "data", function( chunk ) { - chunks.push( chunk ); - dataLen += chunk.length; - }); - - stderr.on( "data", function( chunk ) { - err += chunk; - }); - - stdin.on( "end", function() { - var i = 0, - buffer = new Buffer( dataLen ); - if ( err.length ) { - return callback( new Error( err ) ); - } - chunks.forEach(function ( chunk ) { - chunk.copy( buffer, i, 0, chunk.length ); - i += chunk.length; - }); - callback( null, buffer ); - }); - - stdin.on( "error", function( err ) { - callback( err ); - }); - }; -} - function validateColor( color ) { color = color.replace( /^#/, "" ); if ( ( color.length === 3 || color.length === 6 ) && /^[0-9a-f]+$/i.test( color ) ) { + // ok } else if ( namedColors.indexOf( color.toLowerCase() ) !== -1 ) { + // ok } else { throw new Error( "invalid color \"" + color + "\"" ); @@ -75,22 +59,32 @@ function validateColor( color ) { } function validateDimension( params, dimensionParams ) { - var invalidParams = dimensionParams.filter(function( param ) { + var invalidParams = dimensionParams.filter( function( param ) { return parseInt( params[ param ], 10 ) > dimensionLimit; - }); + } ); if ( invalidParams.length ) { - throw new Error( "dimension bigger than allowed limit " + JSON.stringify( _.pick( params, invalidParams ) ) ); + const reportedInvalidParams = Object.create( null ); + for ( const key in invalidParams ) { + reportedInvalidParams[ key ] = params[ key ]; + } + throw new Error( "dimension bigger than allowed limit " + + JSON.stringify( reportedInvalidParams ) ); } } function validateInteger( params, integerParams ) { - var invalidParams = integerParams.filter(function( param ) { - return isNaN( parseInt( params[ param ], 10 ) ) || (/[^0-9]/).test( params[ param ] ); - }); + var invalidParams = integerParams.filter( function( param ) { + return isNaN( parseInt( params[ param ], 10 ) ) || ( /[^0-9]/ ).test( params[ param ] ); + } ); if ( invalidParams.length ) { - throw new Error( "got a non-integer " + JSON.stringify( _.pick( params, invalidParams ) ) ); + const reportedInvalidParams = Object.create( null ); + for ( const key in invalidParams ) { + reportedInvalidParams[ key ] = params[ key ]; + } + throw new Error( "got a non-integer " + + JSON.stringify( reportedInvalidParams ) ); } } @@ -102,9 +96,9 @@ function validateOpacity( opacity ) { } function validatePresence( params, requiredParams ) { - var missingParams = requiredParams.filter(function( param ) { + var missingParams = requiredParams.filter( function( param ) { return !params[ param ]; - }); + } ); if ( missingParams.length ) { throw new Error( "missing \"" + missingParams.join( "\", \"" ) + "\"" ); @@ -117,6 +111,9 @@ var generateIcon, generateImage, generateTexture, task( callback ); }, concurrentQueues ); +// We'll `resume()` it once we know the ImageMagic version. +imageQueue.pause(); + generateImage = function( params, callback ) { if ( params.icon ) { generateIcon( params.icon, callback ); @@ -131,28 +128,26 @@ generateIcon = function( params, callback ) { // Add '#' in the beginning of the colors if needed color = hashColor( params.color ); - // http://www.imagemagick.org/Usage/masking/#shapes - // IM 6.7.9 and below: - // $ convert -background -alpha shape output.png - // IM > 6.7.9: (see #132 http://git.io/gfSacg) - // $ convert -set colorspace RGB -background -alpha shape -set colorspace sRGB output.png + // https://usage.imagemagick.org/masking/#shapes + // See https://github.com/jquery/download.jqueryui.com/issues/132 for why + // * `-set colorspace RGB` is needed (twice) in IM >6.7.9. + // * `-channel A -gamma 0.5` is needed so that partially transparent + // pixels are not too dark. + // Full command: + // $ magick -set colorspace RGB -background -alpha shape -channel A -gamma 0.5 -set colorspace sRGB output.png - imageQueue.push(function( innerCallback ) { + imageQueue.push( function( innerCallback ) { try { - if ( semver.gt( imVersion, "6.7.9" ) ) { - im( __dirname + "/../template/themeroller/icon/mask.png" ) - .out( "-set", "colorspace", "RGB" ) - .background( color ) - .out( "-alpha", "shape" ) - .out( "-set", "colorspace", "sRGB" ) - .stream( "png", stream2Buffer( innerCallback ) ); - } else { - im( __dirname + "/../template/themeroller/icon/mask.png" ) - .background( color ) - .out( "-alpha", "shape" ) - .stream( "png", stream2Buffer( innerCallback ) ); - } - } catch( err ) { + processImageMagick( [ + path.join( __dirname, "/../template/themeroller/icon/mask.png" ), + "-set", "colorspace", "RGB", + "-background", color, + "-alpha", "shape", + "-channel", "A", "-gamma", "0.45", + "-set", "colorspace", "sRGB", + "png:-" + ], innerCallback ); + } catch ( err ) { return innerCallback( err ); } }, callback ); @@ -166,15 +161,21 @@ generateTexture = function( params, callback ) { filename = params.type.replace( /-/g, "_" ).replace( /$/, ".png" ); - // http://www.imagemagick.org/Usage/compose/#dissolve - // $ convert -size x 'xc:' -compose dissolve -define compose:args=,100 -composite output.png + // https://usage.imagemagick.org/compose/#dissolve + // $ magick -size x 'xc:' -compose dissolve -define compose:args=,100 -composite output.png - imageQueue.push(function( innerCallback ) { + imageQueue.push( function( innerCallback ) { try { - im( params.width, params.height, color ) - .out( __dirname + "/../template/themeroller/texture/" + filename, "-compose", "dissolve", "-define", "compose:args=" + params.opacity + ",100", "-composite" ) - .stream( "png", stream2Buffer( innerCallback ) ); - } catch( err ) { + processImageMagick( [ + "-size", `${ params.width }x${ params.height }`, + "canvas:" + color, + path.join( __dirname, "/../template/themeroller/texture/", filename ), + "-compose", "dissolve", + "-define", `compose:args=${ params.opacity },100`, + "-composite", + "png:-" + ], innerCallback ); + } catch ( err ) { return innerCallback( err ); } }, callback ); @@ -300,19 +301,19 @@ Image.prototype = { cached.data = data; delete cached.callbacks; } - callbacks.forEach(function( callback ) { + callbacks.forEach( function( callback ) { callback( err, filename, data ); - }); + } ); delete cached.callbacks; if ( err ) { cache.destroy( filename ); } - }); + } ); } }; -// Check the ImageMagick installation using node-gm (in a hacky way). -async.series([ +// Check the ImageMagick installation. +async.series( [ function( callback ) { var wrappedCallback = function( err ) { if ( err ) { @@ -321,29 +322,34 @@ async.series([ callback(); }; try { - im()._spawn([ "convert", "-version" ], true, wrappedCallback ); - } catch( err ) { + processImageMagick( [ "-version" ], wrappedCallback ); + } catch ( err ) { return wrappedCallback( err ); } }, function( callback ) { - im()._spawn([ "convert", "-version" ], false, stream2Buffer(function( err, buffer ) { + processImageMagick( [ "-version" ], function( err, buffer ) { + if ( err ) { + return callback( err ); + } var output = buffer.toString( "utf8" ); - if ( !(/ImageMagick/).test( output ) ) { + if ( !( /ImageMagick/ ).test( output ) ) { return callback( new Error( "ImageMagick not installed.\n" + output ) ); } - imVersion = output.split( "\n" )[ 0 ].replace( /^Version: ImageMagick ([^ ]*).*/, "$1" ); + const imVersion = output.split( /\r?\n/ )[ 0 ].replace( /^Version: ImageMagick ([^ ]*).*/, "$1" ); if ( !semver.valid( imVersion ) ) { return callback( new Error( "Could not identify ImageMagick version.\n" + output ) ); } + imageQueue.resume(); callback(); - })); + } ); } ], function( err ) { if ( err ) { + // On error, abort throw new Error( err ); } -}); +} ); module.exports = Image; diff --git a/lib/themeroller.textures.js b/lib/themeroller-textures.js similarity index 92% rename from lib/themeroller.textures.js rename to lib/themeroller-textures.js index 7cc6d097..8650ab84 100644 --- a/lib/themeroller.textures.js +++ b/lib/themeroller-textures.js @@ -1,122 +1,124 @@ +"use strict"; + // Hard coded textures -module.exports = [{ +module.exports = [ { "type": "flat", "width": "40", "height": "100", "repeat": "repeat-x" -},{ +}, { "type": "glass", "width": "1", "height": "400", "repeat": "repeat-x" -},{ +}, { "type": "highlight_soft", "width": "1", "height": "100", "repeat": "repeat-x" -},{ +}, { "type": "highlight_hard", "width": "1", "height": "100", "repeat": "repeat-x" -},{ +}, { "type": "inset_soft", "width": "1", "height": "100", "repeat": "repeat-x" -},{ +}, { "type": "inset_hard", "width": "1", "height": "100", "repeat": "repeat-x" -},{ +}, { "type": "diagonals_small", "width": "40", "height": "40", "repeat": "repeat" -},{ +}, { "type": "diagonals_medium", "width": "40", "height": "40", "repeat": "repeat" -},{ +}, { "type": "diagonals_thick", "width": "40", "height": "40", "repeat": "repeat" -},{ +}, { "type": "dots_small", "width": "2", "height": "2", "repeat": "repeat" -},{ +}, { "type": "dots_medium", "width": "4", "height": "4", "repeat": "repeat" -},{ +}, { "type": "white_lines", "width": "40", "height": "100", "repeat": "repeat" -},{ +}, { "type": "gloss_wave", "width": "500", "height": "100", "repeat": "repeat-x" -},{ +}, { "type": "diamond", "width": "10", "height": "8", "repeat": "repeat" -},{ +}, { "type": "loop", "width": "21", "height": "21", "repeat": "repeat" -},{ +}, { "type": "carbon_fiber", "width": "8", "height": "9", "repeat": "repeat" -},{ +}, { "type": "diagonal_maze", "width": "10", "height": "10", "repeat": "repeat" -},{ +}, { "type": "diamond_ripple", "width": "22", "height": "22", "repeat": "repeat" -},{ +}, { "type": "hexagon", "width": "12", "height": "10", "repeat": "repeat" -},{ +}, { "type": "layered_circles", "width": "13", "height": "13", "repeat": "repeat" -},{ +}, { "type": "3D_boxes", "width": "12", "height": "10", "repeat": "repeat" -},{ +}, { "type": "glow_ball", "width": "600", "height": "600", "repeat": "repeat-x" -},{ +}, { "type": "spotlight", "width": "600", "height": "600", "repeat": "repeat-x" -},{ +}, { "type": "fine_grain", "width": "60", "height": "60", "repeat": "repeat" -}]; +} ]; diff --git a/lib/themeroller.themegallery.js b/lib/themeroller-themegallery.js similarity index 92% rename from lib/themeroller.themegallery.js rename to lib/themeroller-themegallery.js index a9a98ccb..e65a91c6 100644 --- a/lib/themeroller.themegallery.js +++ b/lib/themeroller-themegallery.js @@ -1,11 +1,70 @@ +"use strict"; + var themeGallery, cache = {}, JqueryUi = require( "./jquery-ui" ), ThemeRoller = require( "./themeroller" ); -var themeGallery = [{ +themeGallery = [ { + thumb: "theme_base.png", + cachedZThemeParams: "5d000080000f05000000000000003d8888d844329a8dfe02723de3e5700bbb34ecf36cdef1e1654faa0015427bdb9eb45ebe89aaede0ec5f0d92417fcc6551ce804ff46bf543167700d2cf4e583f2515147aacb86ffa11c0e588dae72a13c98dc37478199f7eea536e99be0a5accdf26095b21153b5837b6e19713c3fde0bd608e3a453a5bbb0ea4a9ee2cb49ae878238dede4fce273670718a81f6812e535bf2825095fd876f6081938d89d0361e9691f8312484bd4cd25d3593e70f71719c592a006804e6259a0bd53db348dfb8c284e35c0d040491a4f17dd415b7640d51ecd02b4a70a0679eb874cde346f86421b17e1d50e669485d8bfb12d51c6c5c381909fff615f31f2e75f637da2629653bfac6b94ecdfa1d79a9cd99b1a497f7afa170a876606f6daa5aed2818eb39f807bd06f87d146c7431764d57b67ee0977e77543e93fcdeb7ec335bbf7b36d24d243d33ed6b316ef0ad447a30c6f5c0a0fd8f6c90ff8d11d603f08525d33c81928f97302f941ec77546874a56cefc785850ba77fb8a4262d490a54b07bb0bdad3b5aab4e23e11ea8ade0e79afda11500e6045043fd1a0803a11951ab07f8f30564fef61c1f08", + vars: { + name: "Base", + "ffDefault": "Arial,Helvetica,sans-serif", + "fsDefault": "1em", + "fwDefault": "normal", + "cornerRadius": "3px", + "bgColorHeader": "e9e9e9", + "bgTextureHeader": "flat", + "borderColorHeader": "dddddd", + "fcHeader": "333333", + "iconColorHeader": "444444", + "bgColorContent": "ffffff", + "bgTextureContent": "flat", + "borderColorContent": "dddddd", + "fcContent": "333333", + "iconColorContent": "444444", + "bgColorDefault": "f6f6f6", + "bgTextureDefault": "flat", + "borderColorDefault": "c5c5c5", + "fcDefault": "454545", + "iconColorDefault": "777777", + "bgColorHover": "ededed", + "bgTextureHover": "flat", + "borderColorHover": "cccccc", + "fcHover": "2b2b2b", + "iconColorHover": "555555", + "bgColorActive": "007fff", + "bgTextureActive": "flat", + "borderColorActive": "003eff", + "fcActive": "ffffff", + "iconColorActive": "ffffff", + "bgColorHighlight": "fffa90", + "bgTextureHighlight": "flat", + "borderColorHighlight": "dad55e", + "fcHighlight": "777620", + "iconColorHighlight": "777620", + "bgColorError": "fddfdf", + "bgTextureError": "flat", + "borderColorError": "f1a899", + "fcError": "5f3f3f", + "iconColorError": "cc0000", + "bgColorOverlay": "aaaaaa", + "bgTextureOverlay": "flat", + "bgImgOpacityOverlay": "0", + "opacityOverlay": "30", + "bgColorShadow": "666666", + "bgTextureShadow": "flat", + "bgImgOpacityShadow": "0", + "opacityShadow": "30", + "thicknessShadow": "5px", + "offsetTopShadow": "0px", + "offsetLeftShadow": "0px", + "cornerRadiusShadow": "8px" + } +}, { thumb: "theme_90_ui_light.png", - cachedZThemeParams: "5d000001001406000000000000003d8888d844329a8dfe02723de3e5701dc2cb2be0d98fe676bb46e85f3b85ff2d347a9c5170a6c17a4a3d926b08b9d199c4e573fcbf9cc1a2dd092a9d80b6fda5395ff84763f9e74d6cee21250c8f33243ef1589abab919cf7e8298f8769fec181781bf142e5e800e171d39cdf17e9a71fa3f781e8d76766b23c44b6d7f1e75c1abeef4410d820c31ef0620d79195b33d4cfc1e768094ce05fee304b2ad41db26904aed74c8c374ce1ff1c0a5c42f56dac08ad8961127638038b61b2703209b4091d7fb93a47a1d3e43a67c5a94b7e29c959f13c24559cb1a76b1bec1a71f1949db710f4557f3d1da2d39f90aff28f2b6ba8dd96ed5f5a0015166ef5567f70537d248d57b05c70e4fcc5845d9e1610b45d0d394c32ba0d5f992c00dca92aefe65863782767fcedea56a04e59e78457e74c5f1b23fdcd98c0b6bf4dbbe623d93fcb961477a3b6ff6f49245a0d75647ac7dcf1c860ed9882370de9a120924b3eaa4d72b858c41bd8bfbc944508a9fda3a42ff055dfa6e2ef96330dff48fe7a403db64306e0229493b498532edda2985338cbfd2dca06a59153f6300753623a533e25248b8dca8c2261083a9ebf73103a260168b2f957d138e17a4c80b5a901f1b748cff996db44f467265f09d1234456b9819fee221715dc98870f7e120db924d76acd66a3c270b2ee627140195c5c9e869d89c5acdf9330a84af5ae2c6c31792faa3aa55240bbecb844cb72dc1718194fff63506a7", + cachedZThemeParams: "5d000080001406000000000000003d8888d844329a8dfe02723de3e5701dc2cb2be0d98fe676bb46e85f3b85ff2d347a9c5170a6c17a4a3d926b08b9d199c4e573fcbf9cc1a2dd092a9d80b6fda5395ff84763f9e74d6cee21250c8f33243ef1589abab919cf7e8298f8769fec181781bf142e5e800e171d39cdf17e9a71fa3f781e8d76766b23c44b6d7f1e75c1abeef4410d820c31ef0620d79195b33d4cfc1e768094ce05fee304b2ad41db26904aed74c8c374ce1ff1c0a5c42f56dac08ad8961127638038b61b2703209b4091d7fb93a47a1d3e43a67c5a94b7e29c959f13c24559cb1a76b1bec1a71f1949db710f4557f3d1da2d39f90aff28f2b6ba8dd96ed5f5a0015166ef5567f70537d248d57b05c70e4fcc5845d9e1610b45d0d394c32ba0d5f992c00dca92aefe65863782767fcedea56a04e59e78457e74c5f1b23fdcd98c0b6bf4dbbe623d93fcb961477a3b6ff6f49245a0d75647ac7dcf1c860ed9882370de9a120924b3eaa4d72b858c41bd8bfbc944508a9fda3a42ff055dfa6e2ef96330dff48fe7a403db64306e0229493b498532edda2985338cbfd2dca06a59153f6300753623a533e25248b8dca8c2261083a9ebf73103a260168b2f957d138e17a4c80b5a901f1b748cff996db44f467265f09d1234456b9819fee221715dc98870f7e120db924d76acd66a3c270b2ee627140195c5c9e869d89c5acdf9330a84af5ae2c6c31792faa3aa55240bbecb844cb72dc1718194fff63506a7", vars: { name: "UI lightness", "ffDefault": "Trebuchet MS,Tahoma,Verdana,Arial,sans-serif", @@ -69,7 +128,7 @@ var themeGallery = [{ } }, { thumb: "theme_90_ui_dark.png", - cachedZThemeParams: "5d00000100ea05000000000000003d8888d844329a8dfe02723de3e5701cc8cb8a0f4166c8f002bb384a9a94d46b66930ecd1d30314057ff273da42b76034e7df160b9e7ba7002682805fc5802b2a0549efda864da8b43871254a8db50234db11c2645a6a024432bad09b8d7855d6a3efb8321417f716f7d2a0078a45300e3d900039407cc7e51331b176feb95a8300678e4341c911cea30065cfd91c786e8b573d92c84c46463957b2130c9a63f5009ec928e4f6c8de3796f71b4127cfebbccee77d0e3a481a23ce4098d2ce9a732320c6e3c1809119bb08a72eceeec9c5ee52b8b6244643d6c93c42842f43a7230d2c392c7242f1b645b5d815810f6623d16db5a0ac6cc4ee4fcb28466c6a149e1f5ea491ab37b572a440fd4df6bd35f2bc61ee791771cfecd1976767550df34ae11c7176049e996f209cdee56dfd6d0ca9fe4f4ccca30c68c6ec3274e45aa8b69e3145a55e60d34171027cbcfb5807a107a6d173416659fcd4f4f0cc4a6f0dd16e434abd7c115dd999e66724e0f462a49c3798fd9275bad065de6f145d33ec6dc76af35351181829cb3ce2553e33c471b87d5cb39e38c886e03d7c827330c19a8c6d7720e90cc37246cda7513f21b22ec4af478ab0b967432fd2f932b8d5695a922fe7f531b3fd6187d63d8ab160076a332caea71fb0fb00adff987fee8", + cachedZThemeParams: "5d00008000ea05000000000000003d8888d844329a8dfe02723de3e5701cc8cb8a0f4166c8f002bb384a9a94d46b66930ecd1d30314057ff273da42b76034e7df160b9e7ba7002682805fc5802b2a0549efda864da8b43871254a8db50234db11c2645a6a024432bad09b8d7855d6a3efb8321417f716f7d2a0078a45300e3d900039407cc7e51331b176feb95a8300678e4341c911cea30065cfd91c786e8b573d92c84c46463957b2130c9a63f5009ec928e4f6c8de3796f71b4127cfebbccee77d0e3a481a23ce4098d2ce9a732320c6e3c1809119bb08a72eceeec9c5ee52b8b6244643d6c93c42842f43a7230d2c392c7242f1b645b5d815810f6623d16db5a0ac6cc4ee4fcb28466c6a149e1f5ea491ab37b572a440fd4df6bd35f2bc61ee791771cfecd1976767550df34ae11c7176049e996f209cdee56dfd6d0ca9fe4f4ccca30c68c6ec3274e45aa8b69e3145a55e60d34171027cbcfb5807a107a6d173416659fcd4f4f0cc4a6f0dd16e434abd7c115dd999e66724e0f462a49c3798fd9275bad065de6f145d33ec6dc76af35351181829cb3ce2553e33c471b87d5cb39e38c886e03d7c827330c19a8c6d7720e90cc37246cda7513f21b22ec4af478ab0b967432fd2f932b8d5695a922fe7f531b3fd6187d63d8ab160076a332caea71fb0fb00adff987fee8", vars: { name: "UI darkness", "ffDefault": "Segoe UI,Arial,sans-serif", @@ -133,7 +192,7 @@ var themeGallery = [{ } }, { thumb: "theme_90_smoothness.png", - cachedZThemeParams: "5d00000100d905000000000000003d8888d844329a8dfe02723de3e5701fa198449035fc0613ff729a37dd818cf92b1f6938fefa90282d04ae436bb72367f5909357c629e832248af2c086db4ab730aa4cced933a88449eca61db9f7f3b23d47f58a712d809b6088edfb3e1ab0fd4487a569ff42031bb9aefd95aa0a010c29ca4db94f3366f7eb73778008bb690e9d38991c2ab5acb470930c835016bb59ce85223ee2eb2ca74db38bd686e4f0726028207a63e44a04f3ac741d7b0bc5eb3b945532e31642bd3df4c99455415fbf190a56a8384a7a1b06182dbe2759fa2eee7ddbbe32e4be6469419ec67ee260c2aa1654c7a39f0ac8c9b103a68f684dddbe918860409194e418045ff4aa83ac8dfdab69bea83b7cb70ce4c3ebae729c9625a6595e2129f9fb213105d2bddf7fde48ba6844e19d5c44cd55a084be9df2aac2a361d764dd099320cd80849bccd086428d2c262f4adee5e482c00ce779ddaa07097b0111bba4d8294c6b481caba5df02a6796634e7111a01634cc6289876eb90fbc361ec343fcd5c738db443ad6a10040f369eb4d58a61e666560b5f9dac9d9edc158ac7f15f9117fa324e687480e0fa48738c79a5d468cd91db5569f0d4afdc1ab3ffae7ebdc5ac0e6c54873d8b9c97bfffd3cf14ad", + cachedZThemeParams: "5d00008000d905000000000000003d8888d844329a8dfe02723de3e5701fa198449035fc0613ff729a37dd818cf92b1f6938fefa90282d04ae436bb72367f5909357c629e832248af2c086db4ab730aa4cced933a88449eca61db9f7f3b23d47f58a712d809b6088edfb3e1ab0fd4487a569ff42031bb9aefd95aa0a010c29ca4db94f3366f7eb73778008bb690e9d38991c2ab5acb470930c835016bb59ce85223ee2eb2ca74db38bd686e4f0726028207a63e44a04f3ac741d7b0bc5eb3b945532e31642bd3df4c99455415fbf190a56a8384a7a1b06182dbe2759fa2eee7ddbbe32e4be6469419ec67ee260c2aa1654c7a39f0ac8c9b103a68f684dddbe918860409194e418045ff4aa83ac8dfdab69bea83b7cb70ce4c3ebae729c9625a6595e2129f9fb213105d2bddf7fde48ba6844e19d5c44cd55a084be9df2aac2a361d764dd099320cd80849bccd086428d2c262f4adee5e482c00ce779ddaa07097b0111bba4d8294c6b481caba5df02a6796634e7111a01634cc6289876eb90fbc361ec343fcd5c738db443ad6a10040f369eb4d58a61e666560b5f9dac9d9edc158ac7f15f9117fa324e687480e0fa48738c79a5d468cd91db5569f0d4afdc1ab3ffae7ebdc5ac0e6c54873d8b9c97bfffd3cf14ad", vars: { name: "Smoothness", "ffDefault": "Verdana,Arial,sans-serif", @@ -197,7 +256,7 @@ var themeGallery = [{ } }, { thumb: "theme_90_start_menu.png", - cachedZThemeParams: "5d00000100e605000000000000003d8888d844329a8dfe02723de3e5701fa198449035fc0613ff729a37dd818cf92b1f6938fefa90282d04ae436bb72367f5909357c629e832248af2c086db4ab730aa4cced933a88449eca623ed37f3b23d47f58a712d809b6088edfb3707407ac68d6a4aa2377e98846556a3e4064f8b0dbe848040bd1cfe2667fcebd6472549681c5b5ebe9b88c19d96543e0451892e4f8649fc6b40b2a5b80e904eb70616e03248b80ea995594dd0b2964a5b06f2d0d26467452c0c9a08ad68fd73512106b997b03ac956b0b842c6b75eb1f7f972511a2e1c3bce7c814cfb344991e5381836e7bb7809ad4eb17d8426853e041d3889f4f546d0b6f9710a5f3a2399657e43d07af8e408ddefb0e3e8e5e9f60436d294a9211dd5a3e65086c41fc03a5078bf64096d4e3892b1e8cf32795bb6a7ba4b94c1412db3ac96ea6317ba952d27c676cceb8b7e52cd87009789b30c76dc0968bad61c3730ad5fdfdba8bf63ee52fd3d08dc9010de784aab3833d2e9df7ec5cff016ee3909b6ab17bdf066fa09b857cb49a12676b57cd0f7924324a0639a6c412e8f77f1ccd686697a4f5fbc9f5dfb3d44998f4e50cf4a7d1784b8a44b2b48413f2a372c21dbd5e61531f7b3c8818fa3740959e8bfca421aff629f74d9953aa797ae9e95def04a7192bb13123017973e30c6f7738189aa262bfe46e556a3d9dc5e2770724499c9534324655258b0e98cd765518c41dfea1c5e94919bff862f2400", + cachedZThemeParams: "5d00008000e605000000000000003d8888d844329a8dfe02723de3e5701fa198449035fc0613ff729a37dd818cf92b1f6938fefa90282d04ae436bb72367f5909357c629e832248af2c086db4ab730aa4cced933a88449eca623ed37f3b23d47f58a712d809b6088edfb3707407ac68d6a4aa2377e98846556a3e4064f8b0dbe848040bd1cfe2667fcebd6472549681c5b5ebe9b88c19d96543e0451892e4f8649fc6b40b2a5b80e904eb70616e03248b80ea995594dd0b2964a5b06f2d0d26467452c0c9a08ad68fd73512106b997b03ac956b0b842c6b75eb1f7f972511a2e1c3bce7c814cfb344991e5381836e7bb7809ad4eb17d8426853e041d3889f4f546d0b6f9710a5f3a2399657e43d07af8e408ddefb0e3e8e5e9f60436d294a9211dd5a3e65086c41fc03a5078bf64096d4e3892b1e8cf32795bb6a7ba4b94c1412db3ac96ea6317ba952d27c676cceb8b7e52cd87009789b30c76dc0968bad61c3730ad5fdfdba8bf63ee52fd3d08dc9010de784aab3833d2e9df7ec5cff016ee3909b6ab17bdf066fa09b857cb49a12676b57cd0f7924324a0639a6c412e8f77f1ccd686697a4f5fbc9f5dfb3d44998f4e50cf4a7d1784b8a44b2b48413f2a372c21dbd5e61531f7b3c8818fa3740959e8bfca421aff629f74d9953aa797ae9e95def04a7192bb13123017973e30c6f7738189aa262bfe46e556a3d9dc5e2770724499c9534324655258b0e98cd765518c41dfea1c5e94919bff862f2400", vars: { name: "Start", "ffDefault": "Verdana,Arial,sans-serif", @@ -261,7 +320,7 @@ var themeGallery = [{ } }, { thumb: "theme_90_windoze.png", - cachedZThemeParams: "5d00000100f105000000000000003d8888d844329a8dfe02723de3e570162cf18d27450c454aa2f2e374d1d127fabb9ebc66c3ee5a70fb154870371702db6720bcd83f0ecbb2131337f10a086e219c538a2003e4a05b37f637b91dbf9e5ea1a30eee0f7354635c67587b16e39b844855d43f18467d7eaf8e8630b8d1be763e97be1f6d41fe6319979f68179bd8440efaab1fa315e1b203117982c6271a2efd9c841cae644d09b059692771ee3849bed21dc1ef8e25a610ff8cc12b76c247bf91ecc5affa38095834d9d3e770e4b38439b0b62e9db07727f0422aaccb48d9c0242ab4c9e6c75426a8b05e9deecd7b21bc4c4218eee7f72d159b554039df4710e60b427df051f519be5a1292a8d7cb49f0ffb85e0865ad5798a2f66126a96d0b528d9c7a7c554adf79d92e7e4c9e49b0246f8fd61b54ddfce23bb1c02c61d7e98e085f11e76493bc730f79b495717c99a9c1ea416154767a8bedf5cd2ae4ffaa3d127af488725125d56379ec04d1c66190c3c9c766285fcd0aca7567fa99d4197bcbbf300fc4025a9f9245fbb3e774dca1f4c77cc4f3425cf18c1767093b867d6d18493c2ae0112590419f365455205fa267f4de05782d57a286c587dab904e0f2922dbc5106a79b2753402f7f7ca9fd8013ec21a953c3a7232731d40bc4d338a958f72f974672051b95a07d91dafd7ed6f924a8ccc0f395fd21c59ff246a2d1608d8692e9b5a2f78c158a3c41ff062bc5599701e425ab9ac0af525efa4c4837", + cachedZThemeParams: "5d00008000f105000000000000003d8888d844329a8dfe02723de3e570162cf18d27450c454aa2f2e374d1d127fabb9ebc66c3ee5a70fb154870371702db6720bcd83f0ecbb2131337f10a086e219c538a2003e4a05b37f637b91dbf9e5ea1a30eee0f7354635c67587b16e39b844855d43f18467d7eaf8e8630b8d1be763e97be1f6d41fe6319979f68179bd8440efaab1fa315e1b203117982c6271a2efd9c841cae644d09b059692771ee3849bed21dc1ef8e25a610ff8cc12b76c247bf91ecc5affa38095834d9d3e770e4b38439b0b62e9db07727f0422aaccb48d9c0242ab4c9e6c75426a8b05e9deecd7b21bc4c4218eee7f72d159b554039df4710e60b427df051f519be5a1292a8d7cb49f0ffb85e0865ad5798a2f66126a96d0b528d9c7a7c554adf79d92e7e4c9e49b0246f8fd61b54ddfce23bb1c02c61d7e98e085f11e76493bc730f79b495717c99a9c1ea416154767a8bedf5cd2ae4ffaa3d127af488725125d56379ec04d1c66190c3c9c766285fcd0aca7567fa99d4197bcbbf300fc4025a9f9245fbb3e774dca1f4c77cc4f3425cf18c1767093b867d6d18493c2ae0112590419f365455205fa267f4de05782d57a286c587dab904e0f2922dbc5106a79b2753402f7f7ca9fd8013ec21a953c3a7232731d40bc4d338a958f72f974672051b95a07d91dafd7ed6f924a8ccc0f395fd21c59ff246a2d1608d8692e9b5a2f78c158a3c41ff062bc5599701e425ab9ac0af525efa4c4837", vars: { name: "Redmond", "ffDefault": "Lucida Grande,Lucida Sans,Arial,sans-serif", @@ -325,7 +384,7 @@ var themeGallery = [{ } }, { thumb: "theme_90_sunny.png", - cachedZThemeParams: "5d000001000006000000000000003d8888d844329a8dfe02723de3e5701cc8cb8a0f4166c8f002bb384a9a94d46b66930ecd1d30314057ff273da42b76034e7df160b9e7ba7002682805fc5802b2a0549efda864da8b438712e9bef7a29f310d784ca8e76257cb28631219c7679208574244410acc6727fec193d1573927af926d67c3e660b43f7c8bf602dd021ad1cb24c1f878791ccf352a6c341568bf5fd453a295fc09f90cd484980973a509ee6371eeed5f3d4e3ffe695dbe6d28d00093dc8428765479cfce85044dc818006ff9d8c56f4043ee49abd518b26039da59f89d15c120e1c42e968ecfd452d846d1df4a98933339513d8a445bff35d4798015a4eed3c2cf70de93df820a0c3ecea3d3c846332fe3aa3914992945e6b31137ea89633f6360a363c9608733b7a27c988aa6b2044a311e4d7d868627c8e19cf44aaae49ab3bc0de9a483f8cd374dd812f4d136e20ac351ee609209fe547de6e1dc40790664a1fd9205222d5eaa6fe2a30f79248e4706b0a52475c2432512baa84ea1e43dcab18ae777f41cf397125bdc6e0c3be6ff89ea3d5ba4ccc1855a9187077dde1db47379d4d5446ee99ff85fd1c8b42161912aaef5b6e40bfd16ed5b2c9c639e7de394ddfec2d73092d6f350b338053db0529fc1777889b65915eb73bbdcf0b88eb822af679a6160bcac21088b608516ac47d95cc1c313430c204d06b0b1e14d3b3b9794e420e89cd0f70a47a640b0e5995743747a9483b97081e8de543e11d881ff59770200", + cachedZThemeParams: "5d000080000006000000000000003d8888d844329a8dfe02723de3e5701cc8cb8a0f4166c8f002bb384a9a94d46b66930ecd1d30314057ff273da42b76034e7df160b9e7ba7002682805fc5802b2a0549efda864da8b438712e9bef7a29f310d784ca8e76257cb28631219c7679208574244410acc6727fec193d1573927af926d67c3e660b43f7c8bf602dd021ad1cb24c1f878791ccf352a6c341568bf5fd453a295fc09f90cd484980973a509ee6371eeed5f3d4e3ffe695dbe6d28d00093dc8428765479cfce85044dc818006ff9d8c56f4043ee49abd518b26039da59f89d15c120e1c42e968ecfd452d846d1df4a98933339513d8a445bff35d4798015a4eed3c2cf70de93df820a0c3ecea3d3c846332fe3aa3914992945e6b31137ea89633f6360a363c9608733b7a27c988aa6b2044a311e4d7d868627c8e19cf44aaae49ab3bc0de9a483f8cd374dd812f4d136e20ac351ee609209fe547de6e1dc40790664a1fd9205222d5eaa6fe2a30f79248e4706b0a52475c2432512baa84ea1e43dcab18ae777f41cf397125bdc6e0c3be6ff89ea3d5ba4ccc1855a9187077dde1db47379d4d5446ee99ff85fd1c8b42161912aaef5b6e40bfd16ed5b2c9c639e7de394ddfec2d73092d6f350b338053db0529fc1777889b65915eb73bbdcf0b88eb822af679a6160bcac21088b608516ac47d95cc1c313430c204d06b0b1e14d3b3b9794e420e89cd0f70a47a640b0e5995743747a9483b97081e8de543e11d881ff59770200", vars: { name: "Sunny", "ffDefault": "Segoe UI,Arial,sans-serif", @@ -389,7 +448,7 @@ var themeGallery = [{ } }, { thumb: "theme_90_overcast.png", - cachedZThemeParams: "5d00000100e705000000000000003d8888d844329a8dfe02723de3e5701dc2cb2be0d98fe676bb46e85f3aa40c252a04b46f31562b0c806bd69f170762738b5397e133b132fe145d787e5ad5f6687b3e2fe39ebde1adf367a4dd23c595bf575aa368f41efe7ba104f8b2b474cc8ec6611e769a951b66e3c70e8268333419550d639e6a1e59b8c2f643b13b3d3f9c43eded892b613c0481985f9926a7a12f6acb61b179d33739b709ecc42656db78333df23a79cc2e9e44dd43223360bd7c1a8288e69afddc5ce632275c2382051d3325a2d6d4d3f5ba856eb9da8a390005ffac23fc020dcae25c4f3175797e6a39e2214ec32f0d9b45b2ac326b607031b09e95914759f919acde4bccf23e226717430062e95f35f0c90be401ef3eac71106fa99c6efb73290f982407c8037239f2dda9ca7b94da194e907a3b845f40b980bf01cfa3a2e190436e5fbd4b2c5f126f270843181bedf3d9866fd92d3433b20a0491082a5499b010d26cd907829aee63d41cd99674a5a85adfe4806fefb500becca6477bb5d54b7ccc64da364fb9127508ed2657afa8db823c0e569126011d1b302a5006dc73d4072bfc9c5b303c5921ca3be3a9423d7b8c82fb4361570681cc31865f8cfcef0c4a76e61b4e1f8356e37a560077d709375d023ffa791899bc8837f17cf976063affffe15b6707", + cachedZThemeParams: "5d00008000e705000000000000003d8888d844329a8dfe02723de3e5701dc2cb2be0d98fe676bb46e85f3aa40c252a04b46f31562b0c806bd69f170762738b5397e133b132fe145d787e5ad5f6687b3e2fe39ebde1adf367a4dd23c595bf575aa368f41efe7ba104f8b2b474cc8ec6611e769a951b66e3c70e8268333419550d639e6a1e59b8c2f643b13b3d3f9c43eded892b613c0481985f9926a7a12f6acb61b179d33739b709ecc42656db78333df23a79cc2e9e44dd43223360bd7c1a8288e69afddc5ce632275c2382051d3325a2d6d4d3f5ba856eb9da8a390005ffac23fc020dcae25c4f3175797e6a39e2214ec32f0d9b45b2ac326b607031b09e95914759f919acde4bccf23e226717430062e95f35f0c90be401ef3eac71106fa99c6efb73290f982407c8037239f2dda9ca7b94da194e907a3b845f40b980bf01cfa3a2e190436e5fbd4b2c5f126f270843181bedf3d9866fd92d3433b20a0491082a5499b010d26cd907829aee63d41cd99674a5a85adfe4806fefb500becca6477bb5d54b7ccc64da364fb9127508ed2657afa8db823c0e569126011d1b302a5006dc73d4072bfc9c5b303c5921ca3be3a9423d7b8c82fb4361570681cc31865f8cfcef0c4a76e61b4e1f8356e37a560077d709375d023ffa791899bc8837f17cf976063affffe15b6707", vars: { name: "Overcast", "ffDefault": "Trebuchet MS,Helvetica,Arial,sans-serif", @@ -453,7 +512,7 @@ var themeGallery = [{ } }, { thumb: "theme_90_le_frog.png", - cachedZThemeParams: "5d000001002c06000000000000003d8888d844329a8dfe02723de3e570162cf18d27450c454aa2f2e374d1d127fabb9ebc66c3ee5a70fb154870371702db6720bcd83f0ecbb21413dd3e5a4d5d729593ff86a1eee1f8907cbe2dba34fdcc644e0b09188d721be473287c5a4c199840d7ae3e253b2a53b08c5c0adf27de3b7988e40829512d71bd77e51167c0f02c97403acdf001b240a37988d281eea666da524b12e0101e801704e585a0573df98d8470f4fc5fc3493aca21ba42c2225e078bd2108c50cd5560be4b87feefdb239084f629326361d7a0014f9c0fb2401a63a86c21709354b8bc8c9e760d09f0313668155c977645ae8056c2fb390e2455a9df685ff2e1398cbbee47f92bcebec0daa45a9212bb833780d5c41c5fac2479fa48e8756f1ba433a4e76fe75310f6309745f35131d9132dfd23bcf8684147b40dd53e295d7b9104da3eba71ae91579acffe6670d987bff8d6b4cf5613224ea7e915da81131c0adafedb1a2606bced5f6d690639c330c6dcdcd2c084be41e7133da23743bed122753da07a7b02bfe6e30f23b3e552e361d7557aea962374c2ffd8383ce59fe37828fff63a160aaaad8f30b7ae25b3b6f9f52b656b10c04dab465b133c29f1e32470a5b6d248c49ed2ed45412ca53d95564604fb39030e2b1adf9690d08c5f0f10fa7e8fc25211675b6a2e44b7b2c610478c3506d1e52bb075cbacb67e7f0f3dff8a557bd2", + cachedZThemeParams: "5d000080002c06000000000000003d8888d844329a8dfe02723de3e570162cf18d27450c454aa2f2e374d1d127fabb9ebc66c3ee5a70fb154870371702db6720bcd83f0ecbb21413dd3e5a4d5d729593ff86a1eee1f8907cbe2dba34fdcc644e0b09188d721be473287c5a4c199840d7ae3e253b2a53b08c5c0adf27de3b7988e40829512d71bd77e51167c0f02c97403acdf001b240a37988d281eea666da524b12e0101e801704e585a0573df98d8470f4fc5fc3493aca21ba42c2225e078bd2108c50cd5560be4b87feefdb239084f629326361d7a0014f9c0fb2401a63a86c21709354b8bc8c9e760d09f0313668155c977645ae8056c2fb390e2455a9df685ff2e1398cbbee47f92bcebec0daa45a9212bb833780d5c41c5fac2479fa48e8756f1ba433a4e76fe75310f6309745f35131d9132dfd23bcf8684147b40dd53e295d7b9104da3eba71ae91579acffe6670d987bff8d6b4cf5613224ea7e915da81131c0adafedb1a2606bced5f6d690639c330c6dcdcd2c084be41e7133da23743bed122753da07a7b02bfe6e30f23b3e552e361d7557aea962374c2ffd8383ce59fe37828fff63a160aaaad8f30b7ae25b3b6f9f52b656b10c04dab465b133c29f1e32470a5b6d248c49ed2ed45412ca53d95564604fb39030e2b1adf9690d08c5f0f10fa7e8fc25211675b6a2e44b7b2c610478c3506d1e52bb075cbacb67e7f0f3dff8a557bd2", vars: { name: "Le Frog", "ffDefault": "Lucida Grande,Lucida Sans,Arial,sans-serif", @@ -517,7 +576,7 @@ var themeGallery = [{ } }, { thumb: "theme_90_flick.png", - cachedZThemeParams: "5d00000100ea05000000000000003d8888d844329a8dfe02723de3e5701258a13d5ba490adca99e4a02bf259c3083bccd292fbc7a815b30f470ff7ff66fa62b6dd388eb0ff95f693739fdbaa8434129ba964c9c618330e8d3698d18f5069869197a7edb7ba209c2ccade9dea94baa4a782a787eace2a1b08565447bae4412db4abad045349d9cb0fc7060aedefefdaac07401dda39c726dc250e5f78622446cf4a39bbeea63dd307c06c2362e8e26d7bb280690729a1abebd5f1738f5aac6321c77a387f1304195de162fb7581e71ef6c674d6acb08b15a16869876ad2d5896f919473079348d741e4a00bf904bf5f866cd04abc216db3dc5b4a189effddc2c54c7cc163c95759731e8bd7034b2c13913207f31fa0cafaef7f5b646c233a4ef7d962df2eb186164536a2904819f0908c694d0ffab5bcdbd9eced8cb0e7f4b5c20932dd38cad03620e65c24079c291dd3456ff0d5db07ab9a2cec4c84a44acc6fd22753c503e28ec1fa083aea2d17f17ab2a83605505738f671c83f0f8c5b20b273e0d15def5a631d504d63cfe7aa2ab9c5809c740725e4a63f63aa447bd7a1f50c17c65adcbf80bac308cf01348b1d08a8610c9375d7579e5297ccba18ed2be1ea3d39fe5de771", + cachedZThemeParams: "5d00008000ea05000000000000003d8888d844329a8dfe02723de3e5701258a13d5ba490adca99e4a02bf259c3083bccd292fbc7a815b30f470ff7ff66fa62b6dd388eb0ff95f693739fdbaa8434129ba964c9c618330e8d3698d18f5069869197a7edb7ba209c2ccade9dea94baa4a782a787eace2a1b08565447bae4412db4abad045349d9cb0fc7060aedefefdaac07401dda39c726dc250e5f78622446cf4a39bbeea63dd307c06c2362e8e26d7bb280690729a1abebd5f1738f5aac6321c77a387f1304195de162fb7581e71ef6c674d6acb08b15a16869876ad2d5896f919473079348d741e4a00bf904bf5f866cd04abc216db3dc5b4a189effddc2c54c7cc163c95759731e8bd7034b2c13913207f31fa0cafaef7f5b646c233a4ef7d962df2eb186164536a2904819f0908c694d0ffab5bcdbd9eced8cb0e7f4b5c20932dd38cad03620e65c24079c291dd3456ff0d5db07ab9a2cec4c84a44acc6fd22753c503e28ec1fa083aea2d17f17ab2a83605505738f671c83f0f8c5b20b273e0d15def5a631d504d63cfe7aa2ab9c5809c740725e4a63f63aa447bd7a1f50c17c65adcbf80bac308cf01348b1d08a8610c9375d7579e5297ccba18ed2be1ea3d39fe5de771", vars: { name: "Flick", "ffDefault": "Helvetica,Arial,sans-serif", @@ -581,7 +640,7 @@ var themeGallery = [{ } }, { thumb: "theme_90_pepper_grinder.png", - cachedZThemeParams: "5d000001001906000000000000003d8888d844329a8dfe02723de3e5701dc2cb2be0d98fe676bb46e85f3b85ff2d347a9c5170a6c17a4a3d926b08b9d199c4e573fcbf9cc1a2dd092a9d80b6fda5395ff84763f9e74d6cee21250c8f33243ef1589abab919cf7e829904d85fec181781bf142e5e800e171d39cdf18499c1c70f0026d274283db2a42242020d35cd80b68753755c23f4adb91ac529904b6f2f8217d9e213264920528770fb56c17e70572cf5ae766ed29c7e5713d6b95591133fb0712f078c43f9d129a953fa5f9de0bf038e12349bb80ca170610aac127c2bad83594919ee1c1beeb22e8af591ad3a0a87da78416fa54f6487e339512185426c31164613a09497031e278e659ea972ae502b8f3651a3651aea4c3b7592de1d5c15e4056453514f1e2ca331600d986395bf6e157ad4570ef2216e3283ebdb8c230db2354e49fd5f224432d6fd0f587fe3c95f19537fa89956ee93fb211aa8fa45367c8c5cc3fb68958f45776b6910b4d6131ffe9f311a01c670fcaaae53233c63789833d1e8eaf0352a5d4b3648ec609730af03a6def8833bc9f51349e8038788432d9c9667a7a202b51a3637ef31adf21640b2aa7fa03162631645b1445a2c8b2044f4014e26916a1c4810ee9d84580fe1a39433b1ccc0e9cc3a62475fb88f6ab9b7b5c206a2a1ae20975170e27812d900656588ad6444a333115fc7c27c8776e2cce6d6f0521a997f70f4859a89ffe1b18343", + cachedZThemeParams: "5d000080001906000000000000003d8888d844329a8dfe02723de3e5701dc2cb2be0d98fe676bb46e85f3b85ff2d347a9c5170a6c17a4a3d926b08b9d199c4e573fcbf9cc1a2dd092a9d80b6fda5395ff84763f9e74d6cee21250c8f33243ef1589abab919cf7e829904d85fec181781bf142e5e800e171d39cdf18499c1c70f0026d274283db2a42242020d35cd80b68753755c23f4adb91ac529904b6f2f8217d9e213264920528770fb56c17e70572cf5ae766ed29c7e5713d6b95591133fb0712f078c43f9d129a953fa5f9de0bf038e12349bb80ca170610aac127c2bad83594919ee1c1beeb22e8af591ad3a0a87da78416fa54f6487e339512185426c31164613a09497031e278e659ea972ae502b8f3651a3651aea4c3b7592de1d5c15e4056453514f1e2ca331600d986395bf6e157ad4570ef2216e3283ebdb8c230db2354e49fd5f224432d6fd0f587fe3c95f19537fa89956ee93fb211aa8fa45367c8c5cc3fb68958f45776b6910b4d6131ffe9f311a01c670fcaaae53233c63789833d1e8eaf0352a5d4b3648ec609730af03a6def8833bc9f51349e8038788432d9c9667a7a202b51a3637ef31adf21640b2aa7fa03162631645b1445a2c8b2044f4014e26916a1c4810ee9d84580fe1a39433b1ccc0e9cc3a62475fb88f6ab9b7b5c206a2a1ae20975170e27812d900656588ad6444a333115fc7c27c8776e2cce6d6f0521a997f70f4859a89ffe1b18343", vars: { name: "Pepper Grinder", "ffDefault": "Trebuchet MS,Tahoma,Verdana,Arial,sans-serif", @@ -645,7 +704,7 @@ var themeGallery = [{ } }, { thumb: "theme_90_eggplant.png", - cachedZThemeParams: "5d000001000a06000000000000003d8888d844329a8dfe02723de3e570162cf18d27450c454aa2f2e374d1d127fabb9ebc66c3ee5a70fb154870371702db6720bcd83f0ecbb2131337f10a086e219c538a2003e4a05b37f637b91dbf9e5ea1a30eee0ffb74635c67587b16e39b844855d43f178d38275889cd939f1184eeca71f7e594e71f6f96d372a160c9fd058cc3003aea9441550f3f9751117d0da036df76edb03e87a84e824a0f217c8517a47dada3783819b83eb6f23fa6d4dc57eaff26ab6c0bc34e2fcd741a883d5ab94dc5e40b3151cf12a4e3917b21772cbe46ad9299cc77e3c626aa6f5b46ff76ff0d028a47b7408a635edd9c9beaa6b880ebb1adab7ee56914a6f22ff5b7baf518f9cd238ceb36eb73329fe8b61e19654a4e079577fcedac934bc9f3e75985a014431d83e94e6e1f888d9bfead1d8e6d8345a09590fd1d03217194234d7d3b21e612631855f9c86abc40897c97aa7e423aa067707e7feaf003eb132d504ce4468310fe4179ffc10b581d115c347c2d5355e112b166d32524caeaee9932a8f21f22cbecba1ee02b676f0fbbfee99d3c809f1e9b638fad615b76b4ae99a4279e9e59f888aa34b3f857f87b6c8b5d401372e200a9c4c050669da0d2215ac8946003171e5cdabe218f23642ed6cbaeb348f02ba27e7310ae5e85c411a4049af7f5346c16b9ee19e2a06b237800820406d4534ea0f89fffd96b9b3d", + cachedZThemeParams: "5d000080000a06000000000000003d8888d844329a8dfe02723de3e570162cf18d27450c454aa2f2e374d1d127fabb9ebc66c3ee5a70fb154870371702db6720bcd83f0ecbb2131337f10a086e219c538a2003e4a05b37f637b91dbf9e5ea1a30eee0ffb74635c67587b16e39b844855d43f178d38275889cd939f1184eeca71f7e594e71f6f96d372a160c9fd058cc3003aea9441550f3f9751117d0da036df76edb03e87a84e824a0f217c8517a47dada3783819b83eb6f23fa6d4dc57eaff26ab6c0bc34e2fcd741a883d5ab94dc5e40b3151cf12a4e3917b21772cbe46ad9299cc77e3c626aa6f5b46ff76ff0d028a47b7408a635edd9c9beaa6b880ebb1adab7ee56914a6f22ff5b7baf518f9cd238ceb36eb73329fe8b61e19654a4e079577fcedac934bc9f3e75985a014431d83e94e6e1f888d9bfead1d8e6d8345a09590fd1d03217194234d7d3b21e612631855f9c86abc40897c97aa7e423aa067707e7feaf003eb132d504ce4468310fe4179ffc10b581d115c347c2d5355e112b166d32524caeaee9932a8f21f22cbecba1ee02b676f0fbbfee99d3c809f1e9b638fad615b76b4ae99a4279e9e59f888aa34b3f857f87b6c8b5d401372e200a9c4c050669da0d2215ac8946003171e5cdabe218f23642ed6cbaeb348f02ba27e7310ae5e85c411a4049af7f5346c16b9ee19e2a06b237800820406d4534ea0f89fffd96b9b3d", vars: { name: "Eggplant", "ffDefault": "Lucida Grande,Lucida Sans,Arial,sans-serif", @@ -709,7 +768,7 @@ var themeGallery = [{ } }, { thumb: "theme_90_dark_hive.png", - cachedZThemeParams: "5d00000100ff05000000000000003d8888d844329a8dfe02723de3e5701fa198449035fc0613ff729a37dd818cf92b1f6938fefa90282d04ae436bb72367f5909357c629e832248af2c086db4ab730aa4cced933a88449eca62a2077f3b23d47f58a712d809b6088edfb376d83e455b59f1bd990b3e590e5b9859f221228f742dd665bf96b9fd9e3574ac7fcf6b14180770cff19badfcd5912cafe1d15076a7cd5d6a38f5bf3de8777b7e0e46ddecad664f6da67d9e7ed6866f388de5f52cfa28800fa5f71b0d93ac44a679f85e674f50a8fa0d7091eeb89e4b61afc078b70df935316b54fef3ee3f350018f888afd65b83b1aa11577cf937c215bae2e5e55588ceb579c861c19667fd1f186603329813b27af2c7c673689add67c71bf05955878df03b921ede3f895c3b23aae7b86cbed8d3539e6d6795e69a7a8bd94c049208eee6cbbb88bfeb0788988037dc3bebccc889d34b1e89d03011a2a1425c09711378a2058c9cf79a3022dbcffa63f0366c7b5a4d1e2da0c3cb70ec0dc311bd10631b737a9a797d68640f31c416006647304297a0f4758bd7050d8a76bab2d414c6fc2f8d7459e9019c4d41e3b79c78e456703f8cba0ac01c1adae86d23ccdecda8afe23c7a77ab25dce84e6e7d76a4a0067190a03cfd31b17f2ef41b9769f7e28adef1ec42c8ede8f443143d6ffbcc2bd3e", + cachedZThemeParams: "5d00008000ff05000000000000003d8888d844329a8dfe02723de3e5701fa198449035fc0613ff729a37dd818cf92b1f6938fefa90282d04ae436bb72367f5909357c629e832248af2c086db4ab730aa4cced933a88449eca62a2077f3b23d47f58a712d809b6088edfb376d83e455b59f1bd990b3e590e5b9859f221228f742dd665bf96b9fd9e3574ac7fcf6b14180770cff19badfcd5912cafe1d15076a7cd5d6a38f5bf3de8777b7e0e46ddecad664f6da67d9e7ed6866f388de5f52cfa28800fa5f71b0d93ac44a679f85e674f50a8fa0d7091eeb89e4b61afc078b70df935316b54fef3ee3f350018f888afd65b83b1aa11577cf937c215bae2e5e55588ceb579c861c19667fd1f186603329813b27af2c7c673689add67c71bf05955878df03b921ede3f895c3b23aae7b86cbed8d3539e6d6795e69a7a8bd94c049208eee6cbbb88bfeb0788988037dc3bebccc889d34b1e89d03011a2a1425c09711378a2058c9cf79a3022dbcffa63f0366c7b5a4d1e2da0c3cb70ec0dc311bd10631b737a9a797d68640f31c416006647304297a0f4758bd7050d8a76bab2d414c6fc2f8d7459e9019c4d41e3b79c78e456703f8cba0ac01c1adae86d23ccdecda8afe23c7a77ab25dce84e6e7d76a4a0067190a03cfd31b17f2ef41b9769f7e28adef1ec42c8ede8f443143d6ffbcc2bd3e", vars: { name: "Dark Hive", "ffDefault": "Verdana,Arial,sans-serif", @@ -773,7 +832,7 @@ var themeGallery = [{ } }, { thumb: "theme_90_cupertino.png", - cachedZThemeParams: "5d000001001506000000000000003d8888d844329a8dfe02723de3e570162cf18d27450c454aa2f2e374d1d127fabb9ebc66c3ee5a70fb154870371702db6720bcd83f0ecbb2131337f10a086e219c538a2003e4a05b37f637b91dbf9e5ea1a30eee0ffb74635c67587b16e39b844855d43f178d7223e5844a27feed562a919e51a896a2b947ea0fe5769740cad2f353f43f6a6badb4f9f158f439cd0ec77f1c39bf311c9c328e70d7c078862964f803cfeb841e8f7d5c944dbec24d93e6f8096a02b769b976b7c435f6ee6b8cc66444023920a41270f305b7e9d576789ae017b7f8a16eaf3fddede704785a409c4fbbbe7481fb749e2ae44e8ec018139c9bdaad1ff148a94614b8bed98e577f2a12f376997fd9e196c9c2c4e8ade8e18f17a54d27413cfc22eb103a061cb0ace641d769abc84778c949297f6f00a2f8f502cbad9d937aace60187dbe5719bd8904bf7ad27999098ff61920ef5fc2ce8fc28088bfe4f049af0fad1091984f7cc7c512a75c11b0d0a81a1fd4a9aee0b0ef437e5370a72a1568ba3e12b2912e0c16c95f0a7db121b89833319b9b3d4d8508bce99ed91cf922da9c78511a24190d7a54d45882fc347df992d44a5223515862e741257e6920e3b32e5fe9c19f11f086f26e66f1e9ec94da3cb5f2dcc8be91cb5dc08236c670e97128b7e9dcf8dafebcda7ac193a3251395116da73002ca7756c07fbe44bbe5ebf232ca9146b55f92ec226878e01a55ccffba986c3", + cachedZThemeParams: "5d000080001506000000000000003d8888d844329a8dfe02723de3e570162cf18d27450c454aa2f2e374d1d127fabb9ebc66c3ee5a70fb154870371702db6720bcd83f0ecbb2131337f10a086e219c538a2003e4a05b37f637b91dbf9e5ea1a30eee0ffb74635c67587b16e39b844855d43f178d7223e5844a27feed562a919e51a896a2b947ea0fe5769740cad2f353f43f6a6badb4f9f158f439cd0ec77f1c39bf311c9c328e70d7c078862964f803cfeb841e8f7d5c944dbec24d93e6f8096a02b769b976b7c435f6ee6b8cc66444023920a41270f305b7e9d576789ae017b7f8a16eaf3fddede704785a409c4fbbbe7481fb749e2ae44e8ec018139c9bdaad1ff148a94614b8bed98e577f2a12f376997fd9e196c9c2c4e8ade8e18f17a54d27413cfc22eb103a061cb0ace641d769abc84778c949297f6f00a2f8f502cbad9d937aace60187dbe5719bd8904bf7ad27999098ff61920ef5fc2ce8fc28088bfe4f049af0fad1091984f7cc7c512a75c11b0d0a81a1fd4a9aee0b0ef437e5370a72a1568ba3e12b2912e0c16c95f0a7db121b89833319b9b3d4d8508bce99ed91cf922da9c78511a24190d7a54d45882fc347df992d44a5223515862e741257e6920e3b32e5fe9c19f11f086f26e66f1e9ec94da3cb5f2dcc8be91cb5dc08236c670e97128b7e9dcf8dafebcda7ac193a3251395116da73002ca7756c07fbe44bbe5ebf232ca9146b55f92ec226878e01a55ccffba986c3", vars: { name: "Cupertino", "ffDefault": "Lucida Grande,Lucida Sans,Arial,sans-serif", @@ -837,7 +896,7 @@ var themeGallery = [{ } }, { thumb: "theme_90_south_street.png", - cachedZThemeParams: "5d000001001b06000000000000003d8888d844329a8dfe02723de3e5703cc0623479daf4a6c1f840d9a020e7cb40db39f67f60e5f164f422fee829ee46a0fcfca7fde4c1a176a1bc61910ff7b0aabe4cac07784b80d8b9234c1eac734f68c69ea147ada4273094fc58be325599a652553ed74fcbc9028550021740c46290f25081bb82900e474c770e047a594b1b9013c5b190b7d2d5d0c37d0c301ed27742765d448e248303d2144bfaf6e92d2b244df38a88e3804a828bba2b5fdb8a0484df803fa131a57adb89c392c8b0070821a6a6e1f7bc3370ff920923e05bd2b55757c64ec7b42bceda39402844c88561008368c3cc47c0317127d4149de79dcdc4cc0fac9e234616cdb7f1d2caa8980fb0c40b9bd0bd81e1fab81cd7204745107c10f1f444b7d964eb75720ad049a3ad57a79bd4ff304ec78b6d41ad9c8869f231ac051397adad21ee5ba670592805c9efe7d7a77c9d28be2b0b6c0b497ac123f02145c38271975a0412cac37a1aacdf8eedc5f673d5bf8c949e7f55d0ee9b73780f663e530fb7a2a78ef510e2afe4c24f46265018a9de75da0d23a28eff097d141a6572a0b295918af4ebe3381bbfad71bde38df16422f0ca472c2356ca04fab83abcfdff45f773781d8394ad46c646218d82c086e3ba6435aba1d6ac857eeb06347005ef7969f691849fa616942e545108c3b665c999e97bb8eb2646a342e09a3ec763f4481980e7c2b850240ede65f09688b5fed7e9ee", + cachedZThemeParams: "5d000080001b06000000000000003d8888d844329a8dfe02723de3e5703cc0623479daf4a6c1f840d9a020e7cb40db39f67f60e5f164f422fee829ee46a0fcfca7fde4c1a176a1bc61910ff7b0aabe4cac07784b80d8b9234c1eac734f68c69ea147ada4273094fc58be325599a652553ed74fcbc9028550021740c46290f25081bb82900e474c770e047a594b1b9013c5b190b7d2d5d0c37d0c301ed27742765d448e248303d2144bfaf6e92d2b244df38a88e3804a828bba2b5fdb8a0484df803fa131a57adb89c392c8b0070821a6a6e1f7bc3370ff920923e05bd2b55757c64ec7b42bceda39402844c88561008368c3cc47c0317127d4149de79dcdc4cc0fac9e234616cdb7f1d2caa8980fb0c40b9bd0bd81e1fab81cd7204745107c10f1f444b7d964eb75720ad049a3ad57a79bd4ff304ec78b6d41ad9c8869f231ac051397adad21ee5ba670592805c9efe7d7a77c9d28be2b0b6c0b497ac123f02145c38271975a0412cac37a1aacdf8eedc5f673d5bf8c949e7f55d0ee9b73780f663e530fb7a2a78ef510e2afe4c24f46265018a9de75da0d23a28eff097d141a6572a0b295918af4ebe3381bbfad71bde38df16422f0ca472c2356ca04fab83abcfdff45f773781d8394ad46c646218d82c086e3ba6435aba1d6ac857eeb06347005ef7969f691849fa616942e545108c3b665c999e97bb8eb2646a342e09a3ec763f4481980e7c2b850240ede65f09688b5fed7e9ee", vars: { name: "South Street", "ffDefault": "segoe ui,Arial,sans-serif", @@ -901,7 +960,7 @@ var themeGallery = [{ } }, { thumb: "theme_90_blitzer.png", - cachedZThemeParams: "5d00000100f305000000000000003d8888d844329a8dfe02723de3e5700bbb34ecf36ce5959f380e613cafa997b39424a52ffc947ae6386d03dcb468a5a6d1623ac0d0e3e18cdf4fca8f2d1c997c7af2b425437a134e5b366f618af5193c1d8772b526c0c53c8f5528cb98c54b6fe385b01ee1763c1d4611100b242ec920a41206d3963eee0327838569a479d191f5adfb7b3ffee4f7265bdf6e03b09d243b90abaeb609b96eee56cef6cc0633865895078988ec40819895711fa7efb93b110f6e1b1b1557039d6178c8824adfa105fdfe1f7011f178cbd9f593de821bf90d0a04f35b5f6ca2fe4ccb9ee832eb806819e5b9aa863e9b8246d16fb230a7cb628f97fc471014be50dac4872e81d9821984e5cb27e4c8026968a9b1e80247bd040d1ef8e047f0ae98998cf329c56654903d9807c1e8c51dcb22b9bb42ca22a9b30ab0c2ae230b6228bbf56f8dbb62a2e49281585710b64c5e25d34da872f883d0d15a3f9716d9f34e297cc883697927ddea3a4e56a1de81985f7db5ee4e62567eaaedcd8b802411687a738bb9921d9eba82ca5c09d328015ecf731114054d32c5cb2354800f07cf72fe329c69ef9a2b9f897e6a0e64abf6d605c0ce92167ab590565246907805b9d96399a15ff8a61c815970937e0cc48650f5e8bd2de19096fe950d8484dff5f18410d74ffdd71567", + cachedZThemeParams: "5d00008000f305000000000000003d8888d844329a8dfe02723de3e5700bbb34ecf36ce5959f380e613cafa997b39424a52ffc947ae6386d03dcb468a5a6d1623ac0d0e3e18cdf4fca8f2d1c997c7af2b425437a134e5b366f618af5193c1d8772b526c0c53c8f5528cb98c54b6fe385b01ee1763c1d4611100b242ec920a41206d3963eee0327838569a479d191f5adfb7b3ffee4f7265bdf6e03b09d243b90abaeb609b96eee56cef6cc0633865895078988ec40819895711fa7efb93b110f6e1b1b1557039d6178c8824adfa105fdfe1f7011f178cbd9f593de821bf90d0a04f35b5f6ca2fe4ccb9ee832eb806819e5b9aa863e9b8246d16fb230a7cb628f97fc471014be50dac4872e81d9821984e5cb27e4c8026968a9b1e80247bd040d1ef8e047f0ae98998cf329c56654903d9807c1e8c51dcb22b9bb42ca22a9b30ab0c2ae230b6228bbf56f8dbb62a2e49281585710b64c5e25d34da872f883d0d15a3f9716d9f34e297cc883697927ddea3a4e56a1de81985f7db5ee4e62567eaaedcd8b802411687a738bb9921d9eba82ca5c09d328015ecf731114054d32c5cb2354800f07cf72fe329c69ef9a2b9f897e6a0e64abf6d605c0ce92167ab590565246907805b9d96399a15ff8a61c815970937e0cc48650f5e8bd2de19096fe950d8484dff5f18410d74ffdd71567", vars: { name: "Blitzer", "ffDefault": "Arial,sans-serif", @@ -965,7 +1024,7 @@ var themeGallery = [{ } }, { thumb: "theme_90_humanity.png", - cachedZThemeParams: "5d00000100f805000000000000003d8888d844329a8dfe02723de3e5701258a13d5ba490adca99e4a02bf259c3083bccd292fbc7a815b30f470ff7ff674aedf7a1da791f39f6b67854aba07e4d3b035f2fcc64ece2f1ddcf0f4a91922f40d8a367a3035faa9576ca92e366c91b05dc4807579017af05dfa5c41868e7c60f1cf532cb96cbe9d698621440f659cb3a585d6d4167c12192040a316a5d1de44d0356b8ec2bb9a07d37a0d800a019803fb2730f6951bf7f645e03a48012fe5d19fad63654d9c795944977ddc810be4fa969368f2289c193f20c5a888e0a30c5f02db720d801588c71f86fb3b3b5d2bd62798ee31969f327fbf464c15d822a7c4b70c5a6703d8ea31bea23014ec684b5d2230f29a5ab22cc76c46f4cf42f05e6001457338af56b66cd95b70796053b6ae5871a927f8931b0e5fc374db8ee329762a6540ab7a0f53eb517054bdbd4e461668920d9cf2ca72e9bf69e66813cdd77bd75b2a5b6f97583a656413dabe778c8b4bc48efe332ab808ab3d548c59fa24a97e88e3c907f0f3b7851e06f26948e0270787a4c6228e21797c749f97689177c0674c865c8261ecd32045bfc381c9765040874d23de248f84bfb4645d68851ca09e186217902e5f1d1cb34038a0b26a89a74142697d289c3a8bb20dd910129d5615e89ad44a36f506b10752a22888cb9106900dd882372497feab80fd5b1c0107805bb2de33484e58f22d51e116d47d0dff703df9c", + cachedZThemeParams: "5d00008000f805000000000000003d8888d844329a8dfe02723de3e5701258a13d5ba490adca99e4a02bf259c3083bccd292fbc7a815b30f470ff7ff674aedf7a1da791f39f6b67854aba07e4d3b035f2fcc64ece2f1ddcf0f4a91922f40d8a367a3035faa9576ca92e366c91b05dc4807579017af05dfa5c41868e7c60f1cf532cb96cbe9d698621440f659cb3a585d6d4167c12192040a316a5d1de44d0356b8ec2bb9a07d37a0d800a019803fb2730f6951bf7f645e03a48012fe5d19fad63654d9c795944977ddc810be4fa969368f2289c193f20c5a888e0a30c5f02db720d801588c71f86fb3b3b5d2bd62798ee31969f327fbf464c15d822a7c4b70c5a6703d8ea31bea23014ec684b5d2230f29a5ab22cc76c46f4cf42f05e6001457338af56b66cd95b70796053b6ae5871a927f8931b0e5fc374db8ee329762a6540ab7a0f53eb517054bdbd4e461668920d9cf2ca72e9bf69e66813cdd77bd75b2a5b6f97583a656413dabe778c8b4bc48efe332ab808ab3d548c59fa24a97e88e3c907f0f3b7851e06f26948e0270787a4c6228e21797c749f97689177c0674c865c8261ecd32045bfc381c9765040874d23de248f84bfb4645d68851ca09e186217902e5f1d1cb34038a0b26a89a74142697d289c3a8bb20dd910129d5615e89ad44a36f506b10752a22888cb9106900dd882372497feab80fd5b1c0107805bb2de33484e58f22d51e116d47d0dff703df9c", vars: { name: "Humanity", "ffDefault": "Helvetica,Arial,sans-serif", @@ -1029,7 +1088,7 @@ var themeGallery = [{ } }, { thumb: "theme_90_hot_sneaks.png", - cachedZThemeParams: "5d000001000b06000000000000003d8888d844329a8dfe02723de3e5701167f993e3f4a54f5b89700528b8c6a4b52e66c5646aed5b94a3be2ca8e9eed520e0734846ab0574804bfd52fbb8bba3194dcf044c46081f96bb50a62c6c119b58dc2ac6beb1d5448b245a111f2cef40b4250cd5f34c8b65145de1609a2ce8f0e0ff08911508365841d75e2df9230b236ff92ca0582f18de314161065c9a077090118210fb7f9101262e75734ca653afaf9da622d75e24150b27c93f0893eed0191ad51cfc7b233427c6eeb429597de0ac34ea0c79e387a627ff512883c464cac3e935270259a557b04241175c61fc060805b3f755b4d9690c46a3e13c1f8ac6d145c695570e207ce603be434360005d8b86c6c234b3fb998d938de5bb243204a64eb222c40d21c5d4c4b05cf055eb5620cf834ba9288a34c85227f2b477195fdee8d8b3c97bb80fc2716904a2b74a5a426dbf74890c0bac2470e41eae3e85f7a274747e4fc745b52361366930ab2cc4078ab190faf1c1a11f8c22db37fb6da748a69fc375f8d223ff94019b302b698ddebec4dbb4350eb190ba89d914591158ae98102f5327be6088aae9ed22bceae41152c93ec0e1200e206d02e9abd05e4e955929f17dbbc162d0697b60772c0e592723cae614719d2fa62536035a964fc9aaec67db1fe08066d0601b453a94b5ed55295eea666512cf24c27ffbfe1f34b8913d7d77ad25a5a3265f473835c5274d5325ffe9390807", + cachedZThemeParams: "5d000080000b06000000000000003d8888d844329a8dfe02723de3e5701167f993e3f4a54f5b89700528b8c6a4b52e66c5646aed5b94a3be2ca8e9eed520e0734846ab0574804bfd52fbb8bba3194dcf044c46081f96bb50a62c6c119b58dc2ac6beb1d5448b245a111f2cef40b4250cd5f34c8b65145de1609a2ce8f0e0ff08911508365841d75e2df9230b236ff92ca0582f18de314161065c9a077090118210fb7f9101262e75734ca653afaf9da622d75e24150b27c93f0893eed0191ad51cfc7b233427c6eeb429597de0ac34ea0c79e387a627ff512883c464cac3e935270259a557b04241175c61fc060805b3f755b4d9690c46a3e13c1f8ac6d145c695570e207ce603be434360005d8b86c6c234b3fb998d938de5bb243204a64eb222c40d21c5d4c4b05cf055eb5620cf834ba9288a34c85227f2b477195fdee8d8b3c97bb80fc2716904a2b74a5a426dbf74890c0bac2470e41eae3e85f7a274747e4fc745b52361366930ab2cc4078ab190faf1c1a11f8c22db37fb6da748a69fc375f8d223ff94019b302b698ddebec4dbb4350eb190ba89d914591158ae98102f5327be6088aae9ed22bceae41152c93ec0e1200e206d02e9abd05e4e955929f17dbbc162d0697b60772c0e592723cae614719d2fa62536035a964fc9aaec67db1fe08066d0601b453a94b5ed55295eea666512cf24c27ffbfe1f34b8913d7d77ad25a5a3265f473835c5274d5325ffe9390807", vars: { name: "Hot Sneaks", "ffDefault": "Gill Sans,Arial,sans-serif", @@ -1093,7 +1152,7 @@ var themeGallery = [{ } }, { thumb: "theme_90_excite_bike.png", - cachedZThemeParams: "5d000001001006000000000000003d8888d844329a8dfe02723de3e5703cc0623479daf4a6c1f840d9a020e7cb40db39f67f60e5f164f422fee829ee46a0fcfca7fde4c1a176a1bc61910ff7b0aabe4cac07784b80d8b91ee69aac734f68c69ea147ada4273094fc58bef34b6083bbcbee5d11d9f0526ef6658b7fb72f9e371e255e615b7557ef5d3b3761992158aba37475e9951024072e56ea68b3a557f619ed874ba770f3644f9b6cf88e45c8634e4bf678b1e2d0fc139de5e1935522abdd4638907a2e7609a6f1589ccbb7ac506d78f09e0d461bf46f8b879616fa9e601a270b54c1049f2fb2e53e3d022eebcdaab6607e05f98bcc886376295d7ce1fbf1c977be5e770623ac9ffae4586d6968e3aa6c0dc7d0884d3e7e89edbf70ff6af629785a4a9f3925e0f7198afb5920830ff610e4cd7923f42286fef5b6a8e024042cb8852408c381b1eb25ff934f8f9c9d5014ac5919861aef874c966597ec62007334779680849671990992463211af9d41893a25e6d3d1fadbe012a13f7e642ea337b39cf9a76404c62ae11e46b7d052a05ea5819c102479be254d62a7837cdaf14ca5b50b6281d2629cd69f44b23a0c34aa8cb1ab04a2f2c5395c01f57342508e17c6772baa0e31bd52cc9a0dd674b12cea81d4dfb4ca9da1ce033e20fedf8721269b772c776c05d9ff8190ab00", + cachedZThemeParams: "5d000080001006000000000000003d8888d844329a8dfe02723de3e5703cc0623479daf4a6c1f840d9a020e7cb40db39f67f60e5f164f422fee829ee46a0fcfca7fde4c1a176a1bc61910ff7b0aabe4cac07784b80d8b91ee69aac734f68c69ea147ada4273094fc58bef34b6083bbcbee5d11d9f0526ef6658b7fb72f9e371e255e615b7557ef5d3b3761992158aba37475e9951024072e56ea68b3a557f619ed874ba770f3644f9b6cf88e45c8634e4bf678b1e2d0fc139de5e1935522abdd4638907a2e7609a6f1589ccbb7ac506d78f09e0d461bf46f8b879616fa9e601a270b54c1049f2fb2e53e3d022eebcdaab6607e05f98bcc886376295d7ce1fbf1c977be5e770623ac9ffae4586d6968e3aa6c0dc7d0884d3e7e89edbf70ff6af629785a4a9f3925e0f7198afb5920830ff610e4cd7923f42286fef5b6a8e024042cb8852408c381b1eb25ff934f8f9c9d5014ac5919861aef874c966597ec62007334779680849671990992463211af9d41893a25e6d3d1fadbe012a13f7e642ea337b39cf9a76404c62ae11e46b7d052a05ea5819c102479be254d62a7837cdaf14ca5b50b6281d2629cd69f44b23a0c34aa8cb1ab04a2f2c5395c01f57342508e17c6772baa0e31bd52cc9a0dd674b12cea81d4dfb4ca9da1ce033e20fedf8721269b772c776c05d9ff8190ab00", vars: { name: "Excite Bike", "ffDefault": "segoe ui,Arial,sans-serif", @@ -1157,10 +1216,10 @@ var themeGallery = [{ } }, { thumb: "theme_90_black_matte.png", - cachedZThemeParams: "5d00000100da04000000000000003d888a876183007269df494da9b9c0c3aec70be95feff3605b597b797cf801619b97f2e64b1b6399de9737af85fe32e0828278bd24e77c4a074f564a82fada981d575dbec5f2b870019edd0d79683ad2242b13794f178310bda907557c1c5f8549059576a79e7fee80ac7511ee3cefa601ce3045e17be12f96a19b9205cfeb6dac7dcbb5c9dd66171b35eb319586ec0525f6d09bf0937eab106fec46d3171c72a0cf739832e91f52e3d59409a8103a62bf763a666289994fe5bd3c498ed11d7f495ae689569894bfc08aed801713f890d4107ac8cf06da5bf29736db25268d26df8fb856323612c2a7baf92535e0fa6184118d5e476e36baf78e07d602e886b5d41ec4dcd8d8d75d6c5f033bcd11841c16cbea107026825a0f92918048ceeda5014c107401d62590dcd0f58a9a76616961c0918098c39e070a77ef72c78d17fb0a8e3e2c50d1ca2777302fae34df28efae6dc43e2cf9fc382ddd0b7728fb0f6cb2ad26c31477bb5098a0c1fe613f7b80c486d8a3308c1bae6c148af0de6ac138627951fc9bffffb5851f58", + cachedZThemeParams: "5d00008000ff05000000000000003d8888d844329a8dfe02723de3e5701258a13d5ba490adca99e4a02bf259c3083bccd292fbc7a815b30f470ff7ff674aedf7a1da791f39f6b67854aba07e4d3b035f2fcc64ece2f1ddcf0f4a09cf536ede416841d9b0df80ae036762c23e142b1fb9200b04c2881c34b6edd25b19e09edba11052ce8a796e0eaec88379418f3f302da31359bd62d6966ee109e8b0a6520021432e4d5e5d5d10f58c6a7dd732cf5d08e6837fafd0edce7926d05e7666c69944e04617ba9f59bb870ae72c41e39496e580c31240ac1ca7699f1a5985ba0ece7583d5206b353866ff6f314b46f50a48d7ff90c9c655955122cbbc12648a2e4135038e464ac4ca6b3944a6b28791efded583a79d0939e0c8b08094631ba96bd2981a8df2932532a8faab3404493df9ecae3702e43c3a0fdbda76f33452d71a6fb006cbabea072a57e52dc9201bbf93dec1181d037304d1bdeda1fd48e84c38f5572ab3420a820465a560eb1de4bdab6081097271c2ed703bef5af2c178a1066cdc1d4942a76038bd64c0e785197a419dd3dcf96659b271341987e5966ce44d0aed0d353c2da529dac68f8f64d26d10d94fb991d1473aafcf6beae156a021206d0e3531ade5c1d1e62588154cd820d39743213e40a403a212bf59e8d6b037347fffe75d1726", vars: { name: "Vader", - "tr&ffDefault": "Helvetica,Arial,sans-serif", + "ffDefault": "Helvetica,Arial,sans-serif", "fwDefault": "normal", "fsDefault": "1.1em", "cornerRadius": "5px", @@ -1175,7 +1234,7 @@ var themeGallery = [{ "bgImgOpacityContent": "16", "borderColorContent": "404040", "fcContent": "eeeeee", - "iconColorContent": "bbbbbb", + "iconColorContent": "777777", "bgColorDefault": "adadad", "bgTextureDefault": "highlight_soft", "bgImgOpacityDefault": "35", @@ -1205,11 +1264,23 @@ var themeGallery = [{ "bgImgOpacityError": "95", "borderColorError": "cd0a0a", "fcError": "cd0a0a", - "iconColorError": "cd0a0a" + "iconColorError": "cd0a0a", + "bgColorOverlay": "aaaaaa", + "bgTextureOverlay": "flat", + "bgImgOpacityOverlay": "0", + "opacityOverlay": "30", + "bgColorShadow": "666666", + "bgTextureShadow": "flat", + "bgImgOpacityShadow": "0", + "opacityShadow": "30", + "thicknessShadow": "5px", + "offsetTopShadow": "0px", + "offsetLeftShadow": "0px", + "cornerRadiusShadow": "8px" } }, { thumb: "theme_90_dot_luv.png", - cachedZThemeParams: "5d00000100ea05000000000000003d8888d844329a8dfe02723de3e5700bbb34ecf36ce5959f380e613cafa997b39424a52ffc947ae6386d03dcb468a5a7815c8be751cbeb85f52384d8af826a6f2d5c641d90f69837073c156b7dc24847588f6b14a9a8c7dc301e44abe007e94f6e6c92f078aab5be3c4abbf3879228b2a48115b05dacab0962bd9dd50fdaa46f85079285dec07c941276a7d79d1e2858c68ee7737077d76eb62904eeba7420d8e2f0756bb05a5cb873fc3f1db179474d8bde7707611e362f807baa12d96cf4a00cfea47a4a170c167797d3281d6ff47a7c6f852bfdaa702a5524648e1e61e406f77cc5169eec9274af71300eb525d128c2d8aba556d61caefe4b2abaf55ef4b2f70f1edaf2c6daaa85f8c304bc6d43d2433caea8364ea7276fff6617e84b89c13fa1ee02fcf6c8fa464132c7c76f30fb087543e0128a2043f4c04f39e0d649707cef843ee859101dc7411d8d8398b6653ee74859c3dd5b5721d07516d326cb7e0ffde75882a2710bc22f461c210884265e2956c093e42656b76ea338ff9792c14edc072c1415a7ef705f7e4de64cb0cc36a10be95c054a33d08e34e2f90860411c8268bce234650d33ad74d3bdb18cb0e4a1feeaadf1388700395929d0410402353eddf5f6c5ae12555c25e135ba103f22a28bddfef880b025c6b1fe7ff433", + cachedZThemeParams: "5d00008000ea05000000000000003d8888d844329a8dfe02723de3e5700bbb34ecf36ce5959f380e613cafa997b39424a52ffc947ae6386d03dcb468a5a7815c8be751cbeb85f52384d8af826a6f2d5c641d90f69837073c156b7dc24847588f6b14a9a8c7dc301e44abe007e94f6e6c92f078aab5be3c4abbf3879228b2a48115b05dacab0962bd9dd50fdaa46f85079285dec07c941276a7d79d1e2858c68ee7737077d76eb62904eeba7420d8e2f0756bb05a5cb873fc3f1db179474d8bde7707611e362f807baa12d96cf4a00cfea47a4a170c167797d3281d6ff47a7c6f852bfdaa702a5524648e1e61e406f77cc5169eec9274af71300eb525d128c2d8aba556d61caefe4b2abaf55ef4b2f70f1edaf2c6daaa85f8c304bc6d43d2433caea8364ea7276fff6617e84b89c13fa1ee02fcf6c8fa464132c7c76f30fb087543e0128a2043f4c04f39e0d649707cef843ee859101dc7411d8d8398b6653ee74859c3dd5b5721d07516d326cb7e0ffde75882a2710bc22f461c210884265e2956c093e42656b76ea338ff9792c14edc072c1415a7ef705f7e4de64cb0cc36a10be95c054a33d08e34e2f90860411c8268bce234650d33ad74d3bdb18cb0e4a1feeaadf1388700395929d0410402353eddf5f6c5ae12555c25e135ba103f22a28bddfef880b025c6b1fe7ff433", vars: { name: "Dot Luv", "ffDefault": "Arial,sans-serif", @@ -1273,7 +1344,7 @@ var themeGallery = [{ } }, { thumb: "theme_90_mint_choco.png", - cachedZThemeParams: "5d000001000006000000000000003d8888d844329a8dfe02723de3e5701cc8cb8a0f4166c8f00304d318f2e435fc4b1a60d3060e2d83cad1a27ba4a195c0fdfa6106759866da03494897d32e163c077e94ad990b79693595f02c7d6aaf376f48bc4244d39f1debbdf1780ed214b39f674c4e71ae30b345b34f36599c4f544bb5ee2dc4ef88247938541b1932d422f8ea4b087a2f9fcfe6d985a807d40a7d2114cd0525686b63add438c86e2b75b00110e0a94d621670f382bcf3caea10643430df7eaf0a05069f1b051273881ddb52a4bc7a4cf5a58ad7fe53116681d7c41d889f9efd0e624d6a25728e0ce62191893dd408f8a1fc351315e32e0334a5c57b0c754d8d9aa722d4e67349ef99e7bf0e120d09b3c1682057778511c08c863b845a1a76d89b883fd82b7bde8f58ccf34eadb8c6d372478b001da9ffe07dbee396014740850db9c383a0b3c6a94cc75cb956a7ef99c381bfd97b8dcc71744e826597d06ce43801e99439df72734ba0814e870dfee773bf5b520d4e59cfb8b441f551bb71165735743222ad1d1ecd1401442d2474d7fcb7d1b5d482cdce0d8e90c7f91f2dd2146988a7ee3a4cf9a433aa2a47f24806858321d678271df5f4afe34770bb3a7bcf97a108501a919093da9749156024bf00ac113d9b601084cb1fe6d32ee8991db6704380de416546c53dd3a3ce34c5a600fff86c06f3", + cachedZThemeParams: "5d000080000006000000000000003d8888d844329a8dfe02723de3e5701cc8cb8a0f4166c8f00304d318f2e435fc4b1a60d3060e2d83cad1a27ba4a195c0fdfa6106759866da03494897d32e163c077e94ad990b79693595f02c7d6aaf376f48bc4244d39f1debbdf1780ed214b39f674c4e71ae30b345b34f36599c4f544bb5ee2dc4ef88247938541b1932d422f8ea4b087a2f9fcfe6d985a807d40a7d2114cd0525686b63add438c86e2b75b00110e0a94d621670f382bcf3caea10643430df7eaf0a05069f1b051273881ddb52a4bc7a4cf5a58ad7fe53116681d7c41d889f9efd0e624d6a25728e0ce62191893dd408f8a1fc351315e32e0334a5c57b0c754d8d9aa722d4e67349ef99e7bf0e120d09b3c1682057778511c08c863b845a1a76d89b883fd82b7bde8f58ccf34eadb8c6d372478b001da9ffe07dbee396014740850db9c383a0b3c6a94cc75cb956a7ef99c381bfd97b8dcc71744e826597d06ce43801e99439df72734ba0814e870dfee773bf5b520d4e59cfb8b441f551bb71165735743222ad1d1ecd1401442d2474d7fcb7d1b5d482cdce0d8e90c7f91f2dd2146988a7ee3a4cf9a433aa2a47f24806858321d678271df5f4afe34770bb3a7bcf97a108501a919093da9749156024bf00ac113d9b601084cb1fe6d32ee8991db6704380de416546c53dd3a3ce34c5a600fff86c06f3", vars: { name: "Mint Choc", "ffDefault": "Segoe UI,Helvetica,Arial,sans-serif", @@ -1337,7 +1408,7 @@ var themeGallery = [{ } }, { thumb: "theme_90_black_tie.png", - cachedZThemeParams: "5d000001000306000000000000003d8888d844329a8dfe02723de3e5701fa198449035fc0613ff729a37dd818cf92b1f6938fefa90282d04ae436bb72367f5909357c629e832248af2c086db4ab730aa4cced933a88449eca61db9f7f3b23d47f58a712d809b6088edfb3742f139e63343353b775a5dad629c487de56eaa94326134ad83e6f8fe812a10bad1ef65f0299d5be8297724acce58dc6ba77f53c4573bf047c883ab05c1ca7839ff3c4456b7d37918bb7708bb22880cedc231042ef205d374eb3c09237269caf56bcba6104dcdf7f6c743795289bf7c25b926be64585ebc03f7de01f9a93a3ef71f48a85c30167ac96ed503e95bb812bd30dda0c96bb8776dd5a5cbe03e5449757719081812d2a24975b41e6d8d32b3812076cd5ac4db0c98fb8f443d8aee1738ab3ef3dde1d1934e1f64ca26093d4c71761bb15d6afb5aabbb6d32e2b55bcf8f64fdbbf8481b995b01c021b08beb9a5677d339dc30677de9937ec8aad168dbb3cda028d2e86fe462549ab74d98cc5514c0f180a47c5017f462f13d4e2b32cb671f53d3f2efde5024acddeb85ce226adfc8a534e30f08c5db8c53529b0a2da52be0e53ff8fbd9ceafd4d91c03582ece70ad053bb034a534ca177d89fef7c44cef41dd5673ecce936f21b0866cdbb0e3de28c3ca5795aece28e9351a3829e0147eecf1ffd726cdd1", + cachedZThemeParams: "5d000080000306000000000000003d8888d844329a8dfe02723de3e5701fa198449035fc0613ff729a37dd818cf92b1f6938fefa90282d04ae436bb72367f5909357c629e832248af2c086db4ab730aa4cced933a88449eca61db9f7f3b23d47f58a712d809b6088edfb3742f139e63343353b775a5dad629c487de56eaa94326134ad83e6f8fe812a10bad1ef65f0299d5be8297724acce58dc6ba77f53c4573bf047c883ab05c1ca7839ff3c4456b7d37918bb7708bb22880cedc231042ef205d374eb3c09237269caf56bcba6104dcdf7f6c743795289bf7c25b926be64585ebc03f7de01f9a93a3ef71f48a85c30167ac96ed503e95bb812bd30dda0c96bb8776dd5a5cbe03e5449757719081812d2a24975b41e6d8d32b3812076cd5ac4db0c98fb8f443d8aee1738ab3ef3dde1d1934e1f64ca26093d4c71761bb15d6afb5aabbb6d32e2b55bcf8f64fdbbf8481b995b01c021b08beb9a5677d339dc30677de9937ec8aad168dbb3cda028d2e86fe462549ab74d98cc5514c0f180a47c5017f462f13d4e2b32cb671f53d3f2efde5024acddeb85ce226adfc8a534e30f08c5db8c53529b0a2da52be0e53ff8fbd9ceafd4d91c03582ece70ad053bb034a534ca177d89fef7c44cef41dd5673ecce936f21b0866cdbb0e3de28c3ca5795aece28e9351a3829e0147eecf1ffd726cdd1", vars: { name: "Black Tie", "ffDefault": "Verdana,Arial,sans-serif", @@ -1401,7 +1472,7 @@ var themeGallery = [{ } }, { thumb: "theme_90_trontastic.png", - cachedZThemeParams: "5d00000100f405000000000000003d8888d844329a8dfe02723de3e5701cc8cb8a0f4166c8f00304d318f2e435fc4b1a60d3060e2d83cad1a27ba4a195c0fdfa6106759866da03494897d32e163c077e94ad990b79693595f02c7d6aaf376f48bc4f93539f1debbdf1780ed214b39f6748c7b573d421fee062f48204a18c1b26257fb226d0648500cb0c23e67232df268d61dac818f59e901c624d3b8108c88253b9a193212a6d3e32f24e4bc27cef59ebfb0c1a8e74578b7f4518439ae6db3f583eb30e285467c5b8653d95420138655a9eab8cc18fa73c21f63d2d5846f9cd5484ef5fff6dd1841a214559944c64a5205d2cbc8553d9d6854b6974de93ec0d3f9ce36440fd405fe46fb43788bd677db8f1fb10ef32accf296607f1f6e759ecb2d1634ebba7a9d5faa212b209822da727ee49bfcdeea8c259bdef74551a1683acf3eef0bb1eb5d406f57fb6681a89b896577b3422535576bea00c42a646e4591e6cb6594d01aa535d9dcb6168d2a367a04eeb9fc7049e16a2a7c76ec027e93976579318875d6ded8fdd916b95191d21fe266fd9e81e3a62e221f2a6d35593cf37ce7d3131adc748c5a4164ab9680a1282158f3700bbd07a1900d4e500e1b1b9176e04d142f838df6a965b9dde8e9b4e0c094931b5d424e5267d3b7b5be3ced768b676cc785c5032ddb8c0df548a5222afe5d2655c7ecb4c32dfb7bfffa14872cc", + cachedZThemeParams: "5d00008000f405000000000000003d8888d844329a8dfe02723de3e5701cc8cb8a0f4166c8f00304d318f2e435fc4b1a60d3060e2d83cad1a27ba4a195c0fdfa6106759866da03494897d32e163c077e94ad990b79693595f02c7d6aaf376f48bc4f93539f1debbdf1780ed214b39f6748c7b573d421fee062f48204a18c1b26257fb226d0648500cb0c23e67232df268d61dac818f59e901c624d3b8108c88253b9a193212a6d3e32f24e4bc27cef59ebfb0c1a8e74578b7f4518439ae6db3f583eb30e285467c5b8653d95420138655a9eab8cc18fa73c21f63d2d5846f9cd5484ef5fff6dd1841a214559944c64a5205d2cbc8553d9d6854b6974de93ec0d3f9ce36440fd405fe46fb43788bd677db8f1fb10ef32accf296607f1f6e759ecb2d1634ebba7a9d5faa212b209822da727ee49bfcdeea8c259bdef74551a1683acf3eef0bb1eb5d406f57fb6681a89b896577b3422535576bea00c42a646e4591e6cb6594d01aa535d9dcb6168d2a367a04eeb9fc7049e16a2a7c76ec027e93976579318875d6ded8fdd916b95191d21fe266fd9e81e3a62e221f2a6d35593cf37ce7d3131adc748c5a4164ab9680a1282158f3700bbd07a1900d4e500e1b1b9176e04d142f838df6a965b9dde8e9b4e0c094931b5d424e5267d3b7b5be3ced768b676cc785c5032ddb8c0df548a5222afe5d2655c7ecb4c32dfb7bfffa14872cc", vars: { name: "Trontastic", "ffDefault": "Segoe UI,Helvetica,Arial,sans-serif", @@ -1465,7 +1536,7 @@ var themeGallery = [{ } }, { thumb: "theme_90_swanky_purse.png", - cachedZThemeParams: "5d00000100ef05000000000000003d8888d844329a8dfe02723de3e5701165b3a01c20f0be5b1f592ea3991f45161103ae4da3645c262526027f017f455b8e7a03aeb8e092d6b81c952f833510447cdd5f734859b160c9d05025a52e1d7cd7253b8894cecc9dfc801b0bb1ba1cc7aae88422e525e16615833ee6fa1083898f10fe212319a7359ff302e8a031e018440b34250608a8798b81e1569f16e03cbc24a303e71c485dc941d4bc35dea673df9bacb83fbaaa90cb97596cfe58137884ee544abd72d4bebb4a497f05f69d1730cc3579eb0e794688b8189032aadb36af64dfb34afdfb345a459258d16e5e154ab249bdef6b3dae29907c538ca3aababb24650475de79e1f43c31b1bd37f7a197e4a4b8678fcb1d35324d321d98f7eda0e0a88be744f2cad8ad6501295c0ec05fb260f2d155f98672be8f38276419f8f2f3d87d07da4568b64f8c596d7f5698c4435ff6ea34f741421326a55fa58fb5b5c6772f63946b6fa0b26f861696b3390bc53ecec1aae4b4119dddec7da33d839376e110a26e97f2558b3229e72ce6eb9df695272500300aa9e6c12bf2c99deb729f9d280a80cbc76f91ceedaebfbc0fb395273cc9e3afccc8373e09df4f525c267e8dba32d355ea645bc8af922f2a4515c7bc001db34f33e08e30d218954d9fce5e77231ac3bcd24623d9d0e61012b21d20c6e8a62c9cc667172b9ab15575b5416891b1432d5fff8bb9f3c1", + cachedZThemeParams: "5d00008000ef05000000000000003d8888d844329a8dfe02723de3e5701165b3a01c20f0be5b1f592ea3991f45161103ae4da3645c262526027f017f455b8e7a03aeb8e092d6b81c952f833510447cdd5f734859b160c9d05025a52e1d7cd7253b8894cecc9dfc801b0bb1ba1cc7aae88422e525e16615833ee6fa1083898f10fe212319a7359ff302e8a031e018440b34250608a8798b81e1569f16e03cbc24a303e71c485dc941d4bc35dea673df9bacb83fbaaa90cb97596cfe58137884ee544abd72d4bebb4a497f05f69d1730cc3579eb0e794688b8189032aadb36af64dfb34afdfb345a459258d16e5e154ab249bdef6b3dae29907c538ca3aababb24650475de79e1f43c31b1bd37f7a197e4a4b8678fcb1d35324d321d98f7eda0e0a88be744f2cad8ad6501295c0ec05fb260f2d155f98672be8f38276419f8f2f3d87d07da4568b64f8c596d7f5698c4435ff6ea34f741421326a55fa58fb5b5c6772f63946b6fa0b26f861696b3390bc53ecec1aae4b4119dddec7da33d839376e110a26e97f2558b3229e72ce6eb9df695272500300aa9e6c12bf2c99deb729f9d280a80cbc76f91ceedaebfbc0fb395273cc9e3afccc8373e09df4f525c267e8dba32d355ea645bc8af922f2a4515c7bc001db34f33e08e30d218954d9fce5e77231ac3bcd24623d9d0e61012b21d20c6e8a62c9cc667172b9ab15575b5416891b1432d5fff8bb9f3c1", vars: { name: "Swanky Purse", "ffDefault": "Georgia,Verdana,Arial,sans-serif", @@ -1527,21 +1598,24 @@ var themeGallery = [{ "offsetLeftShadow": "-8px", "cornerRadiusShadow": "12px" } -}]; +} ]; module.exports = function( jqueryUi ) { jqueryUi = jqueryUi instanceof JqueryUi ? jqueryUi : JqueryUi.getStable(); if ( !cache[ jqueryUi.pkg.version ] ) { + // Creating themes - cache[ jqueryUi.pkg.version ] = themeGallery.map(function( item ) { - var theme = new ThemeRoller({ + cache[ jqueryUi.pkg.version ] = themeGallery.map( function( item ) { + var theme = new ThemeRoller( { vars: item.vars, jqueryUi: jqueryUi - }); + } ); theme.thumb = item.thumb; theme.zThemeParams = item.cachedZThemeParams; return theme; - }); + } ); } return cache[ jqueryUi.pkg.version ]; }; + +module.exports.themeGalleryData = themeGallery; diff --git a/lib/themeroller.js b/lib/themeroller.js index 42ff6ba6..1ed66959 100644 --- a/lib/themeroller.js +++ b/lib/themeroller.js @@ -1,15 +1,12 @@ -var colorVars, iconDimension, textureVars, themeStaticCss, - _ = require( "underscore" ), +"use strict"; + +var colorVars, textureVars, themeStaticCss, async = require( "async" ), - fs = require( "fs" ), - http = require( "http" ), - Image = require( "./themeroller.image" ), - logger = require( "simple-log" ).init( "download.jqueryui.com" ), - path = require( "path" ), + Image = require( "./themeroller-image" ), querystring = require( "querystring" ), JqueryUi = require( "./jquery-ui" ), semver = require( "semver" ), - textures = require( "./themeroller.textures" ), + textures = require( "./themeroller-textures" ), util = require( "./util" ), zParams = require( "./zparams" ); @@ -18,19 +15,20 @@ textureVars = "bgTextureDefault bgTextureHover bgTextureActive bgTextureHeader b themeStaticCss = {}; // Hard coded css Y image positioning - context accepts button or panel -function cssYPos( texture, context ){ - var YPos = "50%"; - if( context === "panel" ){ - if( texture === "highlight_soft" || texture === "highlight_hard" || texture === "gloss_wave" ){ +function cssYPos( texture, context ) { + var YPos; + if ( texture === "flat" ) { + return ""; + } + YPos = "50%"; + if ( context === "panel" ) { + if ( texture === "highlight_soft" || texture === "highlight_hard" || texture === "gloss_wave" ) { YPos = "top"; - } - else if( texture === "inset_soft" || texture === "inset_hard" ){ + } else if ( texture === "inset_soft" || texture === "inset_hard" ) { YPos = "bottom"; - } - else if( texture === "glow_ball" ){ + } else if ( texture === "glow_ball" ) { YPos = "35%"; - } - else if( texture === "spotlight" ){ + } else if ( texture === "spotlight" ) { YPos = "2%"; } } @@ -38,10 +36,14 @@ function cssYPos( texture, context ){ } // Hard coded css X image positioning - context accepts button or panel -function cssXPos( texture, context ){ - var XPos = "50%"; - // No conditions yet, may need some for vertical slider patterns - return XPos; +function cssXPos( texture ) { + if ( texture === "flat" ) { + return ""; + } + + // No conditions yet, may need some for vertical slider patterns. + // XPos = "50%"; + return "50%"; } // Add '#' in the beginning of the colors if needed @@ -54,8 +56,8 @@ function hashColor( color ) { // Update textureVars from previous filename format (eg. 02_glass.png) to type-only format (eg. glass). Changed on images generation rewrite (port to nodejs). function oldImagesBackCompat( vars ) { - textureVars.forEach(function( textureVar ) { - var newValue, pair, value; + textureVars.forEach( function( textureVar ) { + var newValue, value; if ( textureVar in vars ) { value = vars[ textureVar ]; newValue = value.replace( /[0-9]*_([^\.]*).png/, "$1" ); @@ -63,15 +65,13 @@ function oldImagesBackCompat( vars ) { vars[ textureVar ] = newValue; } } - }); + } ); } -textures = textures.reduce(function( sum, texture ) { +textures = textures.reduce( function( sum, texture ) { sum[ texture.type ] = texture; return sum; -}, {}); - -iconDimension = [ "256", "240" ]; +}, {} ); /** @@ -87,10 +87,10 @@ function ThemeRoller( options ) { vars = options.vars; if ( vars === false || vars === null ) { this.isNull = true; - this.vars = {}; + vars = {}; return; } else if ( vars ) { - vars = _.clone( vars ); + vars = { ...vars }; this._folderName = vars.folderName; this.name = vars.name; this.scope = vars.scope; @@ -114,16 +114,28 @@ function ThemeRoller( options ) { } oldImagesBackCompat( vars || {} ); this.serializedVars = querystring.stringify( vars ); - vars = this.vars = _.extend( {}, ThemeRoller.defaults, vars ); + vars = this.vars = { + ...ThemeRoller.defaults, + ...vars + }; this.images = []; - // Opacity fix - // TODO: Remove `filter` style when dropping support for IE8 and earlier. - vars.opacityOverlayPerc = vars.opacityOverlay; - vars.opacityShadowPerc = vars.opacityShadow; - if ( semver.gte( this.jqueryUi.pkg.version, "1.10.0" ) ) { + // Opacity fix. + // ThemeRoller sometimes gets post-processed `vars` in `options`, + // e.g. in `buildPackages` in `Gruntfile.js`. To avoid dividing + // `opacityOverlay` by 100 twice, resulting in invalid values, + // record original percentage values with the `Perc` suffix and + // use those for computation inputs. + if ( !( "opacityOverlayPerc" in vars ) ) { + vars.opacityOverlayPerc = vars.opacityOverlay; + } + if ( !( "opacityShadowPerc" in vars ) ) { + vars.opacityShadowPerc = vars.opacityShadow; + } + if ( semver.lt( this.jqueryUi.pkg.version, "1.13.0-a" ) ) { - // For version >= 1.10.0, filter has its own separate line and variable name. + // For version <1.13.0, `filter` has its own separate line + // and variable name. opacityFix = function( opacity ) { return ( opacity / 100 ).toString().replace( /^0\./, "." ); }; @@ -132,22 +144,37 @@ function ThemeRoller( options ) { }; vars.opacityFilterOverlay = opacityFilter( vars.opacityOverlay ); vars.opacityFilterShadow = opacityFilter( vars.opacityShadow ); - vars.opacityOverlay = opacityFix( vars.opacityOverlay ); - vars.opacityShadow = opacityFix( vars.opacityShadow ); + vars.opacityOverlay = opacityFix( vars.opacityOverlayPerc ); + vars.opacityShadow = opacityFix( vars.opacityShadowPerc ); + } else if ( semver.lt( this.jqueryUi.pkg.version, "1.14.0-a" ) ) { + + // For version >=1.13.0 <1.14.0, `-ms-filter` has its own separate line + // and variable name. + opacityFix = function( opacity ) { + return ( opacity / 100 ).toString().replace( /^0\./, "." ); + }; + opacityFilter = function( opacity ) { + return "\"alpha(opacity=" + opacity + ")\""; + }; + vars.opacityFilterOverlay = opacityFilter( vars.opacityOverlay ); + vars.opacityFilterShadow = opacityFilter( vars.opacityShadow ); + vars.opacityOverlay = opacityFix( vars.opacityOverlayPerc ); + vars.opacityShadow = opacityFix( vars.opacityShadowPerc ); } else { - // For version < 1.10.0, opacity (w3c) and filter (IE) are combined into the same line. + // For version >=1.14.0, IE is not supported so there's no `filter` + // or `-ms-filter`. opacityFix = function( opacity ) { - return /* w3c */ ( opacity / 100 ).toString().replace( /^0\./, "." ) + /* IE */ ";filter:Alpha(Opacity=" + opacity + ")"; + return ( opacity / 100 ).toString().replace( /^0\./, "." ); }; - vars.opacityOverlay = opacityFix( vars.opacityOverlay ); - vars.opacityShadow = opacityFix( vars.opacityShadow ); + vars.opacityOverlay = opacityFix( vars.opacityOverlayPerc ); + vars.opacityShadow = opacityFix( vars.opacityShadowPerc ); } // Add '#' in the beginning of the colors if needed - colorVars.forEach(function( colorVar ) { + colorVars.forEach( function( colorVar ) { vars[ colorVar ] = hashColor( vars[ colorVar ] ); - }); + } ); // Set hard coded image url vars.bgImgUrlActive = this._textureUrl( vars.bgColorActive, vars.bgTextureActive, vars.bgImgOpacityActive ); @@ -201,17 +228,19 @@ function ThemeRoller( options ) { vars.bgShadowXPos = cssXPos( vars.bgTextureShadow, "panel" ); if ( !this.name ) { + // Pick name based on theme gallery vs. our vars - themeGallery = require( "./themeroller.themegallery" )(); - themeGallery.some(function( theme ) { + themeGallery = require( "./themeroller-themegallery" )( this.jqueryUi ); + themeGallery.some( function( theme ) { found = theme.isEqual( self ); if ( found ) { self.name = theme.name; } return found; - }); + } ); } if ( !this.name ) { + // Nothing yet? Call it "Custom Theme" then this.name = "Custom Theme"; } @@ -224,7 +253,11 @@ function ThemeRoller( options ) { ThemeRoller.prototype = { _cssRepeat: function( textureType ) { - var texture = textures[ textureType ]; + var texture; + if ( textureType === "flat" ) { + return ""; + } + texture = textures[ textureType ]; if ( typeof texture === "undefined" ) { throw new Error( "Texture \"" + textureType + "\" not defined" ); } @@ -232,9 +265,9 @@ ThemeRoller.prototype = { }, _iconUrl: function( color ) { - var image = new Image({ + var image = new Image( { icon: { color: color } - }); + } ); this.images.push( image ); return this._imageUrl( image.filename() ); }, @@ -248,12 +281,15 @@ ThemeRoller.prototype = { }, _textureUrl: function( color, textureType, opacity ) { - var image, - texture = textures[ textureType ]; + var image, texture; + if ( !textureType || textureType === "flat" ) { + return ""; + } + texture = textures[ textureType ]; if ( typeof texture === "undefined" ) { throw new Error( "No dimensions set for texture \"" + textureType + "\"" ); } - image = new Image({ + image = new Image( { texture: { color: color, height: texture.height, @@ -262,7 +298,7 @@ ThemeRoller.prototype = { type: texture.type, width: texture.width } - }); + } ); this.images.push( image ); return this._imageUrl( image.filename() ); }, @@ -276,13 +312,14 @@ ThemeRoller.prototype = { } if ( !this._css ) { var vars = this.vars; - this._css = themeStaticCss[ this.jqueryUi.pkg.version ].replace( /[\s]+[\S]+\/\*\{([^\}\*\/]+)\}\*\//g, function( match, p1 ) { + this._css = themeStaticCss[ this.jqueryUi.pkg.version ].replace( /([\s]+[\S]+| )\/\*\{([^\}\*\/]+)\}\*\//g, function( match, g1, p1 ) { return " " + vars[ p1 ]; - }); + } ).replace( /[\s]+;/g, ";" ); if ( this.scope ) { this._css = util.scope( this._css, this.scope ); } if ( this.serializedVars.length > 0 ) { + // Theme url this._css = this._css.replace( /\/themeroller\//, this.url() ); } @@ -295,11 +332,10 @@ ThemeRoller.prototype = { callback( null, [] ); return; } - var self = this, - generated = {}; - async.parallel( this.images.map(function( image ) { + var generated = {}; + async.parallel( this.images.map( function( image ) { return function( callback ) { - image.get(function( err, filename, data ) { + image.get( function( err, filename, data ) { if ( generated[ filename ] ) { return callback(); } @@ -307,21 +343,24 @@ ThemeRoller.prototype = { callback( err, { path: filename, data: data - }); - }); + } ); + } ); }; - }), function( err, results ) { + } ), function( err, results ) { + var imageFiles = {}; if ( err ) { err.message = "ThemeRoller#generateImages: " + err.message; - logger.error( err.message ); + console.error( err.message ); + callback( err ); } else { - results = results.filter(function( file ) { - // Skip duplicate images (empty result in here) - return file && file.path && file.data; - }); + results.forEach( function( file ) { + if ( file && file.path && file.data ) { + imageFiles[ file.path ] = file.data; + } + } ); + callback( null, imageFiles ); } - callback( err, results ); - }); + } ); }, folderName: function() { @@ -335,9 +374,9 @@ ThemeRoller.prototype = { isEqual: function( theme ) { var self = this; - return Object.keys( this.vars ).every(function( key ) { + return Object.keys( this.vars ).every( function( key ) { return self.vars[ key ] === theme.vars[ key ]; - }); + } ); }, url: function() { @@ -350,6 +389,6 @@ ThemeRoller.prototype = { } }; -ThemeRoller.defaults = require( "./themeroller.defaults" ); +ThemeRoller.defaults = require( "./themeroller-defaults" ); module.exports = ThemeRoller; diff --git a/lib/themes-packer.js b/lib/themes-packer.js deleted file mode 100644 index 985bfb06..00000000 --- a/lib/themes-packer.js +++ /dev/null @@ -1,158 +0,0 @@ -var async = require( "async" ), - Files = require( "./files" ), - path = require( "path" ), - semver = require( "semver" ), - ThemeGallery = require( "./themeroller.themegallery" ), - util = require( "./util" ); - - -/** - * ThemesPacker( builder, options ) - * - builder [ instanceof Builder ]: jQuery UI builder object. - * - options: details below. - * - * options: - * - includeJs [ Boolean ]: Includes JavaScript files (used at CDN package). Default is false. - */ -function ThemesPacker( builder, options ) { - this.basedir = "jquery-ui-themes-" + builder.jqueryUi.pkg.version; - this.builder = builder; - this.options = options || {}; - this.themeGallery = ThemeGallery( builder.jqueryUi ); -} - -ThemesPacker.prototype = { - /** - * Generates a build array [ , ... ], where - * build-item = { - * path: String:package destination filepath, - * data: String/Buffer:the content itself - * } - */ - pack: function( callback ) { - var build, - add = function( file ) { - if ( arguments.length === 2 ) { - file = { - path: arguments[ 0 ], - data: arguments[ 1 ] - }; - } - output.push({ - path: path.join( basedir, file.path ), - data: file.data - }); - }, - basedir = this.basedir, - builder = this.builder, - options = this.options, - output = [], - themeGallery = this.themeGallery; - - function _build( callback ) { - builder.build(function( error, _build ) { - if ( error ) { - return callback( error ); - } - build = _build; - return callback(); - }); - } - - function pack( callback ) { - // AUTHORS.txt, MIT-LICENSE.txt, and package.json. - build.commonFiles.filter(function( file ) { - return (/AUTHORS.txt|MIT-LICENSE.txt|package.json/).test( file.path ); - }).forEach( add ); - - if ( options.includeJs ) { - // "ui/*.js" - build.componentFiles.filter(function( file ) { - return (/^ui\//).test( file.path ); - }).forEach( add ); - - // "ui/*.min.js" - build.componentMinFiles.filter(function( file ) { - return (/^ui\//).test( file.path ); - }).forEach( add ); - - // "i18n/*.js" - build.i18nFiles.rename( /^ui\//, "" ).forEach( add ); - build.i18nMinFiles.rename( /^ui\//, "" ).forEach( add ); - build.bundleI18n.into( "i18n/" ).forEach( add ); - build.bundleI18nMin.into( "i18n/" ).forEach( add ); - - build.bundleJs.forEach( add ); - build.bundleJsMin.forEach( add ); - } - - async.mapSeries( themeGallery, function( theme, callback ) { - // Bundle CSS (and minified) - build.bundleCss( theme ).into( "themes/" + theme.folderName() + "/" ).forEach( add ); - build.bundleCssMin( theme ).into( "themes/" + theme.folderName() + "/" ).forEach( add ); - - // Custom theme files - // FIXME s/1.11.0pre/1.11.0 - if ( semver.gte( build.pkg.version, "1.11.0pre" ) ) { - add( "themes/" + theme.folderName() + "/theme.css", theme.css() ); - } else { - add( "themes/" + theme.folderName() + "/jquery.ui.theme.css", theme.css() ); - } - - // Custom theme image files - var themeImages = Files(); - if ( semver.gte( build.pkg.version, "1.10.0" ) ) { - themeImages.push({ - path: "animated-overlay.gif", - data: build.get( "themes/base/images/animated-overlay.gif" ).data - }); - } - theme.generateImages(function( error, imageFiles ) { - if ( error ) { - return callback( error, null ); - } - themeImages.concat( imageFiles ).into( "themes/" + theme.folderName() + "/images/" ).forEach( add ); - return callback(); - }); - }, function( error ) { - if ( error ) { - return callback( error ); - } - var crypto = require( "crypto" ); - add({ - path: "MANIFEST", - data: output.sort(function( a, b ) { - return a.path.localeCompare( b.path ); - }).map(function( file ) { - var md5 = crypto.createHash( "md5" ); - md5.update( file.data ); - return file.path.slice( basedir.length ).replace( /^\//, "" ) + " " + md5.digest( "hex" ); - }).join( "\n" ) - }); - return callback(); - }); - } - - async.series([ - _build, - pack - ], function( error ) { - return callback( error, output ); - }); - }, - - filename: function() { - return this.basedir + ".zip"; - }, - - zipTo: function( target, callback ) { - this.pack(function( error, files ) { - if ( error ) { - return callback( error, null ); - } - util.createZip( files, target, callback ); - }); - } -}; - -module.exports = ThemesPacker; diff --git a/lib/util.js b/lib/util.js index a418c9c8..32d2590b 100644 --- a/lib/util.js +++ b/lib/util.js @@ -1,51 +1,22 @@ -var archiver = require( "archiver" ), - fs = require( "fs" ); +"use strict"; + +var fs = require( "node:fs" ), + fastGlob = require( "fast-glob" ); module.exports = { alwaysArray: function( anythingOrArray ) { return Array.isArray( anythingOrArray ) ? anythingOrArray : [ anythingOrArray ]; }, - /** - * createZip( files, target, callback ) - * - files [ Array ]: An array of {data:, path:}'s. - * - target [ Stream / String ]: The target stream, or the target filename (when string). - * - callback( err, written ) [ fn ]: callback function. - */ - createZip: function( files, target, callback ) { - var finishEvent = "finish", - zip = archiver( "zip" ); - - if ( typeof target === "string" ) { - target = fs.createWriteStream( target ); - } - - if ( typeof target.fd !== "undefined" ) { - finishEvent = "close"; - } - - target.on( finishEvent, function() { - callback( null, zip.archiver.pointer ); - }); - - zip.on( "error", callback ); - zip.pipe( target ); - - files.forEach(function( file ) { - if ( file.data == null ) { - return callback( new Error( "Zip: missing data of \"" + file.path + "\"" ) ); - } - - zip.addFile( file.data, { name: file.path } ); - }); - - zip.finalize(); - }, - flatten: function flatten( flat, arr ) { return flat.concat( arr ); }, + glob: function( pattern, options ) { + options = options || {}; + return fastGlob.sync( pattern, options ); + }, + isDirectory: function( filepath ) { return fs.statSync( filepath ).isDirectory(); }, @@ -72,13 +43,16 @@ module.exports = { }, stripBanner: function( file ) { - if ( file && file.data instanceof Buffer ) { + if ( !file ) { + throw new Error( "Missing 'file' argument" ); + } + if ( file.data instanceof Buffer ) { file.data = file.data.toString( "utf8" ); } try { return file.data.replace( /^\s*\/\*[\s\S]*?\*\/\s*/g, "" ); - } catch( err ) { - err.message += "Ops for " + file.path + ".\n"; + } catch ( err ) { + err.message += "Failed to strip banner for " + file.path; throw err; } } diff --git a/lib/zparams.js b/lib/zparams.js index c9bb0110..74df5bf6 100644 --- a/lib/zparams.js +++ b/lib/zparams.js @@ -1,4 +1,6 @@ -var lzma = require( "lzma" ).LZMA(); +"use strict"; + +var lzma = require( "lzma" ); module.exports = { unzip: function( zipped, callback ) { @@ -13,7 +15,7 @@ module.exports = { // Split string into an array of hexes data = []; - while( zipped.length ) { + while ( zipped.length ) { data.push( zipped.slice( -2 ) ); zipped = zipped.slice( 0, -2 ); } @@ -21,7 +23,7 @@ module.exports = { lzma.decompress( data.map( intoDec ), function( unzipped ) { callback( JSON.parse( unzipped ) ); - }); + } ); }, zip: function( obj, callback ) { @@ -44,6 +46,6 @@ module.exports = { }; lzma.compress( data, 0, function( zipped ) { callback( zipped.map( intoHex ).join( "" ) ); - }); + } ); } }; diff --git a/main.js b/main.js index 99351135..9c2891cc 100644 --- a/main.js +++ b/main.js @@ -1,24 +1,12 @@ +"use strict"; + module.exports = { - /** - * The Builder class. - */ - Builder: require( "./lib/builder" ), /** * The JqueryUi class. */ JqueryUi: require( "./lib/jquery-ui" ), - /** - * The jQuery UI Packer class. - */ - Packer: require( "./lib/packer" ), - - /** - * The jQuery UI Themes Packer class. - */ - ThemesPacker: require( "./lib/themes-packer" ), - /** * The Util object. */ @@ -31,7 +19,7 @@ module.exports = { * Returns a frontend instance. */ frontend: function( options ) { - return new ( require( "./frontend" ) )( options ); + return new( require( "./frontend" ) )( options ); }, /** @@ -41,6 +29,6 @@ module.exports = { * Returns themeGallery using jqueryUi's version. */ themeGallery: function( jqueryUi ) { - return require( "./lib/themeroller.themegallery" )( jqueryUi ); + return require( "./lib/themeroller-themegallery" )( jqueryUi ); } }; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..d3d09f98 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5176 @@ +{ + "name": "download.jqueryui.com", + "version": "2.4.4", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "download.jqueryui.com", + "version": "2.4.4", + "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", + "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" + }, + "devDependencies": { + "eslint": "9.21.0", + "eslint-config-jquery": "3.0.2", + "globals": "^16.0.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" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "colorspace": "1.1.x", + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "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==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "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" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "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==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "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==", + "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/@eslint/eslintrc": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.0.tgz", + "integrity": "sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "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", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "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==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "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==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz", + "integrity": "sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.12.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.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", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "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==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "^1.1.5" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@swc/core": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.11.5.tgz", + "integrity": "sha512-EVY7zfpehxhTZXOfy508gb3D78ihoGGmvyiTWtlBPjgIaidP1Xw0naHMD78CWiFlZmeDjKXJufGtsEGOnZdmNA==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.19" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "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" + }, + "peerDependencies": { + "@swc/helpers": "*" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "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==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "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==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "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==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "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==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "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==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "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==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "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==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "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==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "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==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "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==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "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==", + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", + "license": "MIT" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/archiver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", + "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", + "license": "MIT", + "dependencies": { + "archiver-utils": "^5.0.2", + "async": "^3.2.4", + "buffer-crc32": "^1.0.0", + "readable-stream": "^4.0.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^3.0.0", + "zip-stream": "^6.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/archiver-utils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", + "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", + "license": "MIT", + "dependencies": { + "glob": "^10.0.0", + "graceful-fs": "^4.2.0", + "is-stream": "^2.0.1", + "lazystream": "^1.0.0", + "lodash": "^4.17.15", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/archiver-utils/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/archiver-utils/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", + "dev": true, + "license": "MIT", + "engines": { + "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", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "license": "MIT" + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "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" + }, + "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/bare-events": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", + "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", + "license": "Apache-2.0", + "optional": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/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==", + "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" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-crc32": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", + "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", + "license": "MIT", + "engines": { + "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", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "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" + }, + "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==", + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha512-ENwblkFQpqqia6b++zLD/KUWafYlVY/UNnAp7oz7LY7E924wmpye416wBOmvv/HMWzl8gL1kJlfvId/1Dg176w==", + "dev": true, + "license": "MIT", + "engines": { + "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", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/compress-commons": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", + "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", + "license": "MIT", + "dependencies": { + "crc-32": "^1.2.0", + "crc32-stream": "^6.0.0", + "is-stream": "^2.0.1", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "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" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", + "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", + "license": "MIT", + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/dateformat": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/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", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "license": "ISC", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "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/eslint": { + "version": "9.21.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.21.0.tgz", + "integrity": "sha512-KjeihdFqTPhOMXTt7StsDxriV4n66ueuF/jfPNC3j/lduHwr/ijDwJMsF+wyMJethgiKi5wniIE243vi07d3pg==", + "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", + "@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", + "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", + "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.2", + "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/eslint-config-jquery": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/eslint-config-jquery/-/eslint-config-jquery-3.0.2.tgz", + "integrity": "sha512-1CdP7AY5ZuhDGUXz+/b7FwhRnDoK0A1swz+2nZ+zpEYJ3EyV085AOAfpFJL2s+ioHDspNQEsGSsl9uUEm9/f/g==", + "dev": true, + "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==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "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==", + "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/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==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "integrity": "sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "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.13.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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "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==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", + "license": "MIT" + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/file-sync-cmp": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz", + "integrity": "sha512-0k45oWBokCqh2MOexeYKpyqmGKG+8mQ2Wd8iawx+uWd/weWJQAZ6SoPybagdCI4xFisag8iAR77WPm4h3pTfxA==", + "dev": true, + "license": "MIT" + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "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" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/findup-sync": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", + "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.3", + "micromatch": "^4.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "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==", + "dev": true, + "license": "ISC" + }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", + "license": "MIT" + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", + "dev": true, + "license": "MIT", + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/formidable": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz", + "integrity": "sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==", + "license": "MIT", + "dependencies": { + "@paralleldrive/cuid2": "^2.2.2", + "dezalgo": "^1.0.4", + "once": "^1.4.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/getobject": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.2.tgz", + "integrity": "sha512-2zblDBaFcb3rB4rF77XVnuINOE2h2k/OnqXAiy0IrTxUfV1iFp3la33oAQVY9pCpWU268WFYVt2t71hlMuLsOg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "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", + "license": "ISC", + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^2.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": "*" + } + }, + "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/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalyzer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", + "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true, + "license": "MIT" + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/grunt": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.6.1.tgz", + "integrity": "sha512-/ABUy3gYWu5iBmrUSRBP97JLpQUm0GgVveDCp6t3yRNIoltIYw7rEj3g5y1o2PGPR2vfTRGa7WC/LZHLTXnEzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "dateformat": "~4.6.2", + "eventemitter2": "~0.4.13", + "exit": "~0.1.2", + "findup-sync": "~5.0.0", + "glob": "~7.1.6", + "grunt-cli": "~1.4.3", + "grunt-known-options": "~2.0.0", + "grunt-legacy-log": "~3.0.0", + "grunt-legacy-util": "~2.0.1", + "iconv-lite": "~0.6.3", + "js-yaml": "~3.14.0", + "minimatch": "~3.0.4", + "nopt": "~3.0.6" + }, + "bin": { + "grunt": "bin/grunt" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/grunt-check-modules": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grunt-check-modules/-/grunt-check-modules-1.1.0.tgz", + "integrity": "sha512-B0dWhmnqEZztfDbqEb5UWAI/9o0mmlRPEyJYdpitgr/W7i1893cq4hmN+Vw+xJEC/+A5vzmaaHfDZU3fO8JheQ==", + "dev": true, + "engines": { + "node": ">=0.6.0" + }, + "peerDependencies": { + "grunt": ">=0.4.0" + } + }, + "node_modules/grunt-cli": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz", + "integrity": "sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "grunt-known-options": "~2.0.0", + "interpret": "~1.1.0", + "liftup": "~3.0.1", + "nopt": "~4.0.1", + "v8flags": "~3.2.0" + }, + "bin": { + "grunt": "bin/grunt" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/grunt-cli/node_modules/nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "1", + "osenv": "^0.1.4" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/grunt-contrib-clean": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-2.0.1.tgz", + "integrity": "sha512-uRvnXfhiZt8akb/ZRDHJpQQtkkVkqc/opWO4Po/9ehC2hPxgptB9S6JHDC/Nxswo4CJSM0iFPT/Iym3cEMWzKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "async": "^3.2.3", + "rimraf": "^2.6.2" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "grunt": ">=0.4.5" + } + }, + "node_modules/grunt-contrib-copy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz", + "integrity": "sha512-gFRFUB0ZbLcjKb67Magz1yOHGBkyU6uL29hiEW1tdQ9gQt72NuMKIy/kS6dsCbV0cZ0maNCb0s6y+uT1FKU7jA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^1.1.1", + "file-sync-cmp": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-contrib-handlebars": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-handlebars/-/grunt-contrib-handlebars-3.0.0.tgz", + "integrity": "sha512-Zh5fSnyhfOGIDieFNy1eVEqmdB0y2cGkFaceKkfJM4v5OEZP880+SGjbmmuriaVZsG7bOnj0Fg7wP4722GUBSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.1", + "handlebars": "^4.7.7", + "nsdeclare": "0.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/grunt-contrib-handlebars/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-contrib-handlebars/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-contrib-handlebars/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-contrib-handlebars/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-contrib-handlebars/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/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "eslint": "^9.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + }, + "peerDependencies": { + "grunt": ">=1" + } + }, + "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/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/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/grunt-known-options": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz", + "integrity": "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-legacy-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz", + "integrity": "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "colors": "~1.1.2", + "grunt-legacy-log-utils": "~2.1.0", + "hooker": "~0.2.3", + "lodash": "~4.17.19" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/grunt-legacy-log-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz", + "integrity": "sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "~4.1.0", + "lodash": "~4.17.19" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/grunt-legacy-log-utils/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-legacy-log-utils/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-legacy-log-utils/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-legacy-log-utils/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-legacy-log-utils/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/grunt-legacy-util": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz", + "integrity": "sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "async": "~3.2.0", + "exit": "~0.1.2", + "getobject": "~1.0.0", + "hooker": "~0.2.3", + "lodash": "~4.17.21", + "underscore.string": "~3.3.5", + "which": "~2.0.2" + }, + "engines": { + "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", + "dev": true, + "license": "ISC", + "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" + } + }, + "node_modules/grunt/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt/node_modules/minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hooker": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", + "integrity": "sha512-t+UerCsQviSymAInD01Pw+Dn/usmz1sRO+3Zk1+lx8eg+WKpD2ulcwWqHHL0+aseRBr+3+vIhiG1K1JTwaIcTA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "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.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, + "node_modules/interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha512-CLM8SNMDu7C5psFCn6Wg/tgpj/bKAg7hc2gWqcuR9OD5Ft9PhBpIu8PLicPeis+xDd6YX2ncI8MCA64I9tftIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "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", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", + "license": "MIT" + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "license": "MIT", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/liftup": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz", + "integrity": "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "extend": "^3.0.2", + "findup-sync": "^4.0.0", + "fined": "^1.2.0", + "flagged-respawn": "^1.0.1", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.1", + "rechoir": "^0.7.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/liftup/node_modules/findup-sync": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", + "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^4.0.2", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/logform": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", + "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", + "license": "MIT", + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "engines": { + "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", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/lzma": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/lzma/-/lzma-2.3.2.tgz", + "integrity": "sha512-DcfiawQ1avYbW+hsILhF38IKAlnguc/fjHrychs9hdxe4qLykvhT5VTGNs5YRWgaNePh7NTxGD4uv4gKsRomCQ==", + "license": "MIT", + "bin": { + "lzma.js": "bin/lzma.js" + } + }, + "node_modules/make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "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", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "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==", + "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==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "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", + "dependencies": { + "brace-expansion": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "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==", + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT" + }, + "node_modules/node-packager": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/node-packager/-/node-packager-0.0.7.tgz", + "integrity": "sha512-EgcQomiDj89NRySIq1SZRtZ0qJChfmxJwg2OfUJlqcaB6R7iBsPA760Xm3Y+WEOPfpLLT50u2uTA2Df1sWb1QQ==", + "license": "MIT", + "dependencies": { + "archiver": "7.0.1" + } + }, + "node_modules/node-watch": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/node-watch/-/node-watch-0.7.3.tgz", + "integrity": "sha512-3l4E8uMPY1HdMMryPRUAl+oIHtXtyiTlIiESNSVSNxcPfzAFzeTbXFQkZfAwBbo0B1qMSG8nUABx+Gd+YrbKrQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nsdeclare": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/nsdeclare/-/nsdeclare-0.1.0.tgz", + "integrity": "sha512-Wb+BpXFfacpp1cgrQoO5Q2wKHACuMlUE6uayGFFLF3yVuXejBp5Rflk991hWvTQbUuQslXTIvBNOHqYTvzBSjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "license": "MIT", + "dependencies": { + "fn.name": "1.x.x" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "deprecated": "This package is no longer supported.", + "dev": true, + "license": "ISC", + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-root-regex": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pngjs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", + "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.19.0" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/qunit": { + "version": "2.24.1", + "resolved": "https://registry.npmjs.org/qunit/-/qunit-2.24.1.tgz", + "integrity": "sha512-Eu0k/5JDjx0QnqxsE1WavnDNDgL1zgMZKsMw/AoAxnsl9p4RgyLODyo2N7abZY7CEAnvl5YUqFZdkImzbgXzSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "7.2.0", + "node-watch": "0.7.3", + "tiny-glob": "0.2.9" + }, + "bin": { + "qunit": "bin/qunit.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "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==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/requirejs": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.1.15.tgz", + "integrity": "sha512-nofVLcptE+jWPtIaVfC6q2ddPdhSj+5eKGdPO02bXJWKfLQdFTgKE9l8abE8bRVvTr/1TmCTLfxzJT6pNsvUaA==", + "bin": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "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", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "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==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "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", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/sqwish": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/sqwish/-/sqwish-0.2.2.tgz", + "integrity": "sha512-MyaCOSCiThzFPcXHebkWiiXDDlEzbHtbdJBqos4CkUwiKdCgQU0IOzBJwswhBv2Qg3glj5TxzDxvKobuyB4e8w==", + "bin": { + "sqwish": "bin/sqwish" + }, + "engines": { + "node": ">= 0.4.1" + } + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "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==", + "license": "MIT", + "dependencies": { + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "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==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", + "license": "MIT" + }, + "node_modules/tiny-glob": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", + "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "globalyzer": "0.1.0", + "globrex": "^0.1.2" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/underscore.string": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz", + "integrity": "sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "^1.1.1", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/underscore.string/node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "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", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.7.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.9.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", + "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", + "license": "MIT", + "dependencies": { + "logform": "^2.7.0", + "readable-stream": "^3.6.2", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/winston/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/wolfy87-eventemitter": { + "version": "5.2.9", + "resolved": "https://registry.npmjs.org/wolfy87-eventemitter/-/wolfy87-eventemitter-5.2.9.tgz", + "integrity": "sha512-P+6vtWyuDw+MB01X7UeF8TaHBvbCovf4HPEMF/SV7BdDc1SMTiBy13SRD71lQh4ExFTG1d/WNzDGDCyOKSMblw==", + "license": "Unlicense" + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/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==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/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==", + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zip-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", + "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", + "license": "MIT", + "dependencies": { + "archiver-utils": "^5.0.0", + "compress-commons": "^6.0.2", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + } + } +} diff --git a/package.json b/package.json index 7fddc609..d01c051a 100644 --- a/package.json +++ b/package.json @@ -1,39 +1,47 @@ { - "name": "download.jqueryui.com", - "version": "2.0.0", - "dependencies": { - "archiver": "0.4.1", - "async": "0.1.22", - "connect": "1.9.2", - "dateformat": "1.0.2-1.2.3", - "formidable": "1.0.9", - "glob-whatev": "0.1.7", - "gm": "1.8.1", - "grunt": "0.4.1", - "grunt-check-modules": "0.2.0", - "grunt-contrib-handlebars": "0.5.7", - "grunt-contrib-jshint": "0.9.2", - "grunt-contrib-uglify": "0.2.0", - "handlebars": "1.0.12", - "lzma": "1.2.1", - "optimist": "0.3.4", - "requirejs": "2.1.8", - "rimraf": "2.0.2", - "semver": "1.1.0", - "simple-log": "1.1.0", - "sqwish": "0.2.0", - "uglify-js": "2.2.5", - "underscore": "1.4.4", - "winston": "0.6.2" - }, - "devDependencies": { - "nodeunit": "0.7.4" - }, - "main": "main.js", - "engine": { - "node": ">=0.8.x" - }, - "scripts": { - "test": "nodeunit test" - } + "name": "download.jqueryui.com", + "type": "commonjs", + "version": "2.4.4", + "repository": { + "type": "git", + "url": "https://github.com/jquery/download.jqueryui.com.git" + }, + "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", + "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" + }, + "devDependencies": { + "eslint": "9.21.0", + "eslint-config-jquery": "3.0.2", + "globals": "^16.0.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" + }, + "main": "main.js", + "scripts": { + "test": "qunit --require ./test/setup.js test" + }, + "engines": { + "node": ">=18" + } } diff --git a/server.js b/server.js index 4d3fe940..fef88dd0 100755 --- a/server.js +++ b/server.js @@ -1,25 +1,39 @@ #!/usr/bin/env node -var logger = require( "simple-log" ).init( "download.jqueryui.com" ); +"use strict"; -process.on( "uncaughtException", function ( err ) { - logger.error( "Caught exception: " + ( err.stack || err ) ); +process.on( "uncaughtException", function( err ) { + console.error( "Caught exception: " + ( err.stack || err ) ); process.exit( 1 ); -}); +} ); -var argv = require( "optimist" ).argv, - Builder = require( "./lib/builder" ), +var frontend, + { parseArgs } = require( "node:util" ), + { values: argv } = parseArgs( { + options: { + console: { + type: "boolean" + }, + nocache: { + type: "boolean" + }, + host: { + type: "string" + }, + port: { + type: "string" + } + }, + strict: false + } ), + express = require( "express" ), + async = require( "async" ), Cache = require( "./lib/cache" ), - connect = require( "connect" ), - formidable = require( "formidable" ), + { default: formidable } = require( "formidable" ), Frontend = require( "./frontend" ), - httpHost = argv.host || "localhost", - Image = require( "./lib/themeroller.image" ), - JqueryUi = require( "./lib/jquery-ui" ), - Packer = require( "./lib/packer" ), + httpHost = argv.host || "0.0.0.0", querystring = require( "querystring" ), - ThemeRoller = require( "./lib/themeroller" ), - httpPort = argv.port || 8088, + httpPort = argv.port || 8080, routes = { home: "/", download: "/download", @@ -30,17 +44,30 @@ var argv = require( "optimist" ).argv, themerollerParseTheme: "/themeroller/parsetheme.css", themerollerTexture: /^\/themeroller\/images\/(ui-bg_.+)$/ }, - staticDir = "app"; + app = express(); -var frontend = new Frontend(); -if ( process.argv.indexOf( "--nocache" ) === -1 ) { +frontend = new Frontend(); +if ( !argv.nocache ) { Cache.on( 60000 * 60 ); - Packer.cacheThemeGalleryImages(); + + // Cache themeroller images as well + async.forEachSeries( require( "./lib/themeroller-themegallery" )(), function( theme, callback ) { + theme = new( require( "./lib/themeroller" ) )( { vars: theme.vars } ); + theme.generateImages( function( error ) { + if ( error ) { + error.message = "Caching theme images (2): " + error.message; + callback( error ); + throw error; + } + callback(); + } ); + } ); } -// OBS: We are using an older version of connect, which lacks a descent way to centralize requests error handling. +// OBS: We were using an older version of connect, which lacked a descent way to centralize +// requests error handling. We use express now but we haven't updated that code. function error( err, response ) { - logger.error( "User request exception: " + ( err.stack || err ) ); + console.error( "User request exception: " + ( err.stack || err ) ); frontend.error( response ); } @@ -51,53 +78,72 @@ function params( request ) { function route( app ) { app.get( routes.home, function( request, response ) { response.end( frontend.root() ); - }); + } ); app.get( routes.download, function( request, response ) { response.end( frontend.download.index( params( request ), { wrap: true - })); - }); + } ) ); + } ); app.post( routes.download, function( request, response ) { - var form = new formidable.IncomingForm(); - form.parse( request, function( err, fields, files ) { + var form = formidable( {} ); + form.parse( request, function( err, arrFields ) { if ( err ) { return error( err, response ); } + + const fields = Object.create( null ); + for ( const key in arrFields ) { + fields[ key ] = arrFields[ key ].length > 1 ? + arrFields[ key ] : + arrFields[ key ][ 0 ]; + } + frontend.download.create( fields, response, function( err ) { if ( err ) { return error( err, response ); } - }); - }); - }); + } ); + } ); + } ); app.get( routes.downloadComponents, function( request, response ) { response.setHeader( "Content-Type", "application/json" ); response.end( frontend.download.components( params( request ) ) ); - }); + } ); app.get( routes.downloadTheme, function( request, response ) { response.setHeader( "Content-Type", "application/json" ); response.end( frontend.download.theme( params( request ) ) ); - }); + } ); app.get( routes.themeroller, function( request, response ) { response.end( frontend.themeroller.index( params( request ), { wrap: true - })); - }); + } ) ); + } ); app.get( routes.themerollerIcon, function( request, response ) { frontend.themeroller.icon( request.params[ 0 ], response, error ); - }); + } ); app.get( routes.themerollerParseTheme, function( request, response ) { response.setHeader( "Content-Type", "text/css" ); response.end( frontend.themeroller.css( params( request ) ) ); - }); + } ); app.get( routes.themerollerTexture, function( request, response ) { frontend.themeroller.texture( request.params[ 0 ], response, error ); - }); + } ); +} + +route( app ); + +// App static directories. +if ( frontend.options.env === "production" ) { + app.use( "/resources", express.static( "app/dist" ) ); +} else { + app + .use( "/app", express.static( "app/src" ) ) + .use( "/app/images/farbtastic", express.static( "external/farbtastic" ) ) + .use( "/external", express.static( "external" ) ) + .use( "/node_modules", express.static( "node_modules" ) ) + .use( "/template", express.static( "tmp/app/template" ) ); } -connect.createServer( - connect.router( route ), - connect[ "static" ]( staticDir ) -).listen( httpPort, httpHost, function() { +app.listen( httpPort, httpHost, function() { console.log( "HTTP Server running at http://%s:%d", httpHost, httpPort ); -}); +} ); diff --git a/template/download/index.html b/template/download/index.html index 9668cc88..c219ee7f 100644 --- a/template/download/index.html +++ b/template/download/index.html @@ -1,13 +1,17 @@ - - -
+ +{{#if production}} + +{{else}} + +{{/if}} +
@@ -33,18 +37,21 @@

Theme

+

+ If you're having trouble downloading a custom package or theme, please report the issue on GitHub. +

- + {{#if production}} {{else}} - - - - - - - - + + + + + + + + {{/if}} diff --git a/template/download/theme.html b/template/download/theme.html index 2873e358..6d6c231b 100644 --- a/template/download/theme.html +++ b/template/download/theme.html @@ -1,17 +1,13 @@ -

Select the theme you want to include or design a custom theme

+

Select the theme you want to include or design a custom theme

- - -

This field allows you to specify a name for the theme folder in your download. This is helpful if you plan to use multiple themes on a page. It defaults to "theme".

-

This field allows you to specify a CSS scope to limit your theme to a particular portion of a page. This is helpful when using multiple themes on a page. If you don't provide a CSS scope, your theme will apply to all UI elements on a page.

In most situations, you won't need to specify a CSS scope. Please Note: If you provide a CSS scope, you will not get an example page included in your download.

diff --git a/template/download/wrap.html b/template/download/wrap.html index b71eb2ed..4efadf4a 100644 --- a/template/download/wrap.html +++ b/template/download/wrap.html @@ -2,7 +2,7 @@ jQuery UI Download Builder - + diff --git a/template/root.html b/template/root.html index 299bc193..8f2b07ea 100644 --- a/template/root.html +++ b/template/root.html @@ -1,3 +1,3 @@ -Download Builder -ThemeRoller \ No newline at end of file +Download Builder +ThemeRoller \ No newline at end of file diff --git a/template/themeroller/_rollyourown_group_dropshadow.html b/template/themeroller/_rollyourown_group_dropshadow.html index 72a65183..50054b5a 100644 --- a/template/themeroller/_rollyourown_group_dropshadow.html +++ b/template/themeroller/_rollyourown_group_dropshadow.html @@ -15,7 +15,7 @@ %
-
+
% @@ -32,7 +32,7 @@
-
+
diff --git a/template/themeroller/comp_group_a.html b/template/themeroller/comp_group_a.html deleted file mode 100644 index fa0fe4dd..00000000 --- a/template/themeroller/comp_group_a.html +++ /dev/null @@ -1,265 +0,0 @@ - -

Accordion

-
-

Section 1

-
- -

Mauris mauris ante, blandit et, ultrices a, suscipit eget, quam. Integer ut neque. Vivamus nisi metus, molestie vel, gravida in, condimentum sit amet, nunc. Nam a nibh. Donec suscipit eros. Nam mi. Proin viverra leo ut odio. Curabitur malesuada. Vestibulum a velit eu ante scelerisque vulputate.

-
-

Section 2

-
- -

Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttitor velit, faucibus interdum tellus libero ac justo. Vivamus non quam. In suscipit faucibus urna.

-
-

Section 3

-
- -

Nam enim risus, molestie et, porta ac, aliquam ac, risus. Quisque lobortis. Phasellus pellentesque purus in massa. Aenean in pede. Phasellus ac libero ac tellus pellentesque semper. Sed ac felis. Sed commodo, magna quis lacinia ornare, quam ante aliquam nisi, eu iaculis leo purus venenatis dui.

-
    -
  • List item one
  • -
  • List item two
  • -
  • List item three
  • -
-
-
- - -

Tabs

-
- -
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
-
Phasellus mattis tincidunt nibh. Cras orci urna, blandit id, pretium vel, aliquet ornare, felis. Maecenas scelerisque sem non nisl. Fusce sed lorem in enim dictum bibendum.
-
Nam dui erat, auctor a, dignissim quis, sollicitudin eu, felis. Pellentesque nisi urna, interdum eget, sagittis et, consequat vestibulum, lacus. Mauris porttitor ullamcorper augue.
-
- - -

Dialog

-

Open Dialog

- - -
-

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

-
- -

Overlay and Shadow Classes

-
-

Lorem ipsum dolor sit amet, Nulla nec tortor. Donec id elit quis purus consectetur consequat.

Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante. Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci.

Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam. Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat.

Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante. Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci. Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam.

Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat. Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante.

Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci. Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam. Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat.

- - -
-
- -

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

- -
- -
- - -

Framework Icons (content color preview)

-
    - -
  • -
  • -
  • - -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • - -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • - -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • - -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • - -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • - -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • - -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • - -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • - -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • - -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • - -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • - -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • - -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • - -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • - -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • - -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • - -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • - -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • - -
  • -
  • -
  • -
  • -
  • -
- - -

Tooltip

-

- St. Stephen's Cathedral - Tower Bridge -

diff --git a/template/themeroller/comp_group_b.html b/template/themeroller/comp_group_b.html deleted file mode 100644 index 3e287980..00000000 --- a/template/themeroller/comp_group_b.html +++ /dev/null @@ -1,66 +0,0 @@ - -

Button

- -
-
- - - -
-
- - -

Autocomplete

-
- -
- - -

Spinner

- - - -

Slider

-
- - -

Datepicker

-
- - -

Progressbar

-
- - -

Menu

- - - -

Highlight / Error

-
-
-

- Hey! Sample ui-state-highlight style.

-
-
-
-
-
-

- Alert: Sample ui-state-error style.

-
-
\ No newline at end of file diff --git a/template/themeroller/demo.html b/template/themeroller/demo.html new file mode 100644 index 00000000..02c9282c --- /dev/null +++ b/template/themeroller/demo.html @@ -0,0 +1,370 @@ + + + +

Accordion

+
+

First

+
Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.
+

Second

+
Phasellus mattis tincidunt nibh.
+

Third

+
Nam dui erat, auctor a, dignissim quis.
+
+ + +

Autocomplete

+
+ +
+ + +

Button

+ + + + + +

Checkboxradio

+
+
+ + + +
+
+ + +

Controlgroup

+
+ + + + + + + +
+ + +

Tabs

+
+ +
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+
Phasellus mattis tincidunt nibh. Cras orci urna, blandit id, pretium vel, aliquet ornare, felis. Maecenas scelerisque sem non nisl. Fusce sed lorem in enim dictum bibendum.
+
Nam dui erat, auctor a, dignissim quis, sollicitudin eu, felis. Pellentesque nisi urna, interdum eget, sagittis et, consequat vestibulum, lacus. Mauris porttitor ullamcorper augue.
+
+ +

Dialog

+

+ +

+ +

Overlay and Shadow Classes

+
+

Lorem ipsum dolor sit amet, Nulla nec tortor. Donec id elit quis purus consectetur consequat.

Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante. Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci.

Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam. Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat.

Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante. Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci. Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam.

Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat. Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante.

Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci. Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam. Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat. Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi.

+ + +
+
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. +
+ +
+ + +
+

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

+
+ + +

Framework Icons (content color preview)

+
    +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
+ + +

Slider

+
+ + +

Datepicker

+
+ + +

Progressbar

+
+ + +

Selectmenu

+ + + +

Spinner

+ + + +

Menu

+ + + +

Tooltip

+

+ Tooltips can be attached to any element. When you hover +the element with your mouse, the title attribute is displayed in a little box next to the element, just like a native tooltip. +

+ + +

Highlight / Error

+
+
+

+ Hey! Sample ui-state-highlight style.

+
+
+
+
+
+

+ Alert: Sample ui-state-error style.

+
+
diff --git a/template/themeroller/help.html b/template/themeroller/help.html index ddef5ba1..d2a7562a 100644 --- a/template/themeroller/help.html +++ b/template/themeroller/help.html @@ -5,9 +5,5 @@

Using ThemeRoller

If you'd like to use a pre-designed theme, select the Theme Gallery tab and choose from one of the themes in the gallery. You can choose to download or customize any theme from there. To save a theme for later, simply bookmark or copy the URL.

Plugin Developers

-

jQuery UI is driven by a powerful custom CSS framework. The framework is designed to be used not only for our own jQuery UI components, but for custom UI widget development as well! Visit the jQuery UI documentation to learn more about the new jQuery UI CSS Framework.

- -

Browser Support Notice

-

ThemeRoller uses CSS3 border-radius for its round corners. Due to lack of support, corners will appear square in Internet Explorer 6 and 7.

- +

jQuery UI is driven by a powerful custom CSS framework. The framework is designed to be used not only for our own jQuery UI components, but for custom UI widget development as well! Visit the jQuery UI documentation to learn more about the new jQuery UI CSS Framework.

diff --git a/template/themeroller/index.html b/template/themeroller/index.html index 2082b2d2..42e73f1f 100644 --- a/template/themeroller/index.html +++ b/template/themeroller/index.html @@ -1,42 +1,32 @@ - - - -
-
-
-
-
-
- {{{appinterface}}} -
-
-
- {{{compGroupB}}} -
-
-
-
- {{{compGroupA}}} -
-
-
-
-
-
+ +{{#if production}} + + +{{else}} + + +{{/if}} +
+
+ {{{appinterface}}} +
+
+
+ {{{demo}}}
- + {{#if production}} {{else}} - - - - - - - - - + + + + + + + + + {{/if}} diff --git a/template/themeroller/rollyourown.html b/template/themeroller/rollyourown.html index c019ea7f..7d35a6cf 100644 --- a/template/themeroller/rollyourown.html +++ b/template/themeroller/rollyourown.html @@ -1,7 +1,7 @@ Download theme -
+
{{#each groups}} {{#if isFontType}} diff --git a/template/themeroller/themegallery.html b/template/themeroller/themegallery.html index a4a63822..4cc63107 100644 --- a/template/themeroller/themegallery.html +++ b/template/themeroller/themegallery.html @@ -2,7 +2,11 @@
    {{#each themeGallery}}
  • - {{name}} + {{#if ../production}} + {{name}} + {{else}} + {{name}} + {{/if}} {{name}}
  • {{/each}} diff --git a/template/themeroller/wrap.html b/template/themeroller/wrap.html index 1e8a65c6..8ba25aa0 100644 --- a/template/themeroller/wrap.html +++ b/template/themeroller/wrap.html @@ -2,7 +2,7 @@ jQuery UI Themeroller - + - - + @@ -154,8 +53,7 @@

    Welcome to jQuery UI!

    -

    This page demonstrates the widgets you downloaded using the theme you selected in the download builder. We've included and linked to minified versions of jQuery, your personalized copy of jQuery UI (js/jquery-ui-{{ui.version}}.custom.min.js), and css/{{theme}}/jquery-ui-{{ui.version}}.custom.min.css which imports the entire jQuery UI CSS Framework. You can choose to link a subset of the CSS Framework depending on your needs.

    -

    You've downloaded components and a theme that are compatible with jQuery 1.6+. Please make sure you are using jQuery 1.6+ in your production environment.

    +

    This page demonstrates the widgets and theme you selected in Download Builder. Please make sure you are using them with a compatible jQuery version.

    YOUR COMPONENTS:

    @@ -185,6 +83,12 @@

    Autocomplete

    Button

    + +{{/if}} + +{{#if ui.checkboxradio}} + +

    Checkboxradio

    @@ -194,6 +98,34 @@

    Button

    {{/if}} +{{#if ui.controlgroup}} + +

    Controlgroup

    +
    + Rental Car +
    + + + + + + + + + + +
    +
    +{{/if}} + {{#if ui.tabs}}

    Tabs

    @@ -210,20 +142,21 @@

    Tabs

    {{/if}} {{#if ui.dialog}} -

    Dialog

    -

    Open Dialog

    +

    + +

    -

    Overlay and Shadow Classes (not currently used in UI widgets)

    +

    Overlay and Shadow Classes

    Lorem ipsum dolor sit amet, Nulla nec tortor. Donec id elit quis purus consectetur consequat.

    Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante. Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci.

    Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam. Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat.

    Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante. Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci. Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam.

    Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat. Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante.

    Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci. Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam. Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat. Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi.

    -
    -
    -
    -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

    -
    +
    +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
    @@ -237,16 +170,16 @@

    Overlay and Shadow Classes (not currently used in UI

    Framework Icons (content color preview)

      -
    • -
    • -
    • -
    • -
    • -
    • -
    • -
    • -
    • -
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • @@ -430,6 +363,53 @@

      Progressbar

      {{/if}} +{{#if ui.selectmenu}} + +

      Selectmenu

      + +{{/if}} + +{{#if ui.spinner}} + +

      Spinner

      + +{{/if}} + +{{#if ui.menu}} + +

      Menu

      + +{{/if}} + +{{#if ui.tooltip}} + +

      Tooltip

      +

      + Tooltips can be attached to any element. When you hover +the element with your mouse, the title attribute is displayed in a little box next to the element, just like a native tooltip. +

      +{{/if}} +

      Highlight / Error

      @@ -446,5 +426,134 @@

      Highlight / Error

    + + + diff --git a/test/banner.js b/test/banner.js index 4fe514f3..7c9d739c 100644 --- a/test/banner.js +++ b/test/banner.js @@ -1,35 +1,29 @@ -var banner = require( "../lib/banner.js" ), - dateformat = require( "dateformat" ); +"use strict"; -function today(format) { - return dateformat(new Date(), format); +QUnit.module( "banner" ); + +var banner = require( "../lib/banner" ); + +function todayDate() { + return new Date().toISOString().replace( /T.*$$/, "" ); } var pkg = { title: "jQuery UI", - version: "1.9.0", - homepage: "http://jqueryui.com", + version: "1.13.3", + homepage: "https://jqueryui.com", author: { - name: "authors.txt" + name: "OpenJS Foundation and other contributors" }, - licenses: [ - { - type: "MIT" - }, - { - type: "GPL" - } - ] + license: "MIT" }, - fileNames = [ "jquery.ui.autocomplete.js", "jquery.ui.accordion.js" ], - output = "/*! jQuery UI - v1.9.0 - " + today( "isoDate" ) + "\n" + - "* http://jqueryui.com\n" + - "* Includes: jquery.ui.autocomplete.js, jquery.ui.accordion.js\n" + - "* Copyright " + today( "yyyy" ) + " authors.txt; Licensed MIT, GPL */\n\n"; + fileNames = [ "widgets/accordion.js", "widgets/autocomplete.js" ], + output = "/*! jQuery UI - v1.13.3 - " + todayDate() + "\n" + + "* https://jqueryui.com\n" + + "* Includes: widgets/accordion.js, widgets/autocomplete.js\n" + + "* Copyright OpenJS Foundation and other contributors; Licensed MIT */\n\n"; -module.exports = { - "test: case 1": function( test ) { - test.ok( output === banner( pkg, fileNames ), "Not expected output" ); - test.done(); - } -}; +QUnit.test( "banner", function( assert ) { + assert.expect( 1 ); + assert.strictEqual( banner( pkg, fileNames ), output, "Banner generated properly" ); +} ); diff --git a/test/fixtures/images/ui-icons_444444_256x240.png b/test/fixtures/images/ui-icons_444444_256x240.png new file mode 100644 index 00000000..c2daae16 Binary files /dev/null and b/test/fixtures/images/ui-icons_444444_256x240.png differ diff --git a/test/fixtures/jquery-ui-1.12.1/themes/smoothness.css b/test/fixtures/jquery-ui-1.12.1/themes/smoothness.css new file mode 100644 index 00000000..b2d606ec --- /dev/null +++ b/test/fixtures/jquery-ui-1.12.1/themes/smoothness.css @@ -0,0 +1,443 @@ +/*! + * jQuery UI CSS Framework 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/category/theming/ + * + * To view and modify this theme, visit http://jqueryui.com/themeroller/?cornerRadiusShadow=8px&offsetLeftShadow=-8px&offsetTopShadow=-8px&thicknessShadow=8px&opacityShadow=30&bgImgOpacityShadow=0&bgTextureShadow=flat&bgColorShadow=aaaaaa&opacityOverlay=30&bgImgOpacityOverlay=0&bgTextureOverlay=flat&bgColorOverlay=aaaaaa&iconColorError=cd0a0a&fcError=cd0a0a&borderColorError=cd0a0a&bgImgOpacityError=95&bgTextureError=glass&bgColorError=fef1ec&iconColorHighlight=2e83ff&fcHighlight=363636&borderColorHighlight=fcefa1&bgImgOpacityHighlight=55&bgTextureHighlight=glass&bgColorHighlight=fbf9ee&iconColorActive=454545&fcActive=212121&borderColorActive=aaaaaa&bgImgOpacityActive=65&bgTextureActive=glass&bgColorActive=ffffff&iconColorHover=454545&fcHover=212121&borderColorHover=999999&bgImgOpacityHover=75&bgTextureHover=glass&bgColorHover=dadada&iconColorDefault=888888&fcDefault=555555&borderColorDefault=d3d3d3&bgImgOpacityDefault=75&bgTextureDefault=glass&bgColorDefault=e6e6e6&iconColorContent=222222&fcContent=222222&borderColorContent=aaaaaa&bgImgOpacityContent=75&bgTextureContent=flat&bgColorContent=ffffff&iconColorHeader=222222&fcHeader=222222&borderColorHeader=aaaaaa&bgImgOpacityHeader=75&bgTextureHeader=highlight_soft&bgColorHeader=cccccc&cornerRadius=4px&fsDefault=1.1em&fwDefault=normal&ffDefault=Verdana%2CArial%2Csans-serif + */ + + +/* Component containers +----------------------------------*/ +.ui-widget { + font-family: Verdana,Arial,sans-serif; + font-size: 1.1em; +} +.ui-widget .ui-widget { + font-size: 1em; +} +.ui-widget input, +.ui-widget select, +.ui-widget textarea, +.ui-widget button { + font-family: Verdana,Arial,sans-serif; + font-size: 1em; +} +.ui-widget.ui-widget-content { + border: 1px solid #d3d3d3; +} +.ui-widget-content { + border: 1px solid #aaaaaa; + background: #ffffff; + color: #222222; +} +.ui-widget-content a { + color: #222222; +} +.ui-widget-header { + border: 1px solid #aaaaaa; + background: #cccccc url("images/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x; + color: #222222; + font-weight: bold; +} +.ui-widget-header a { + color: #222222; +} + +/* Interaction states +----------------------------------*/ +.ui-state-default, +.ui-widget-content .ui-state-default, +.ui-widget-header .ui-state-default, +.ui-button, + +/* We use html here because we need a greater specificity to make sure disabled +works properly when clicked or hovered */ +html .ui-button.ui-state-disabled:hover, +html .ui-button.ui-state-disabled:active { + border: 1px solid #d3d3d3; + background: #e6e6e6 url("images/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x; + font-weight: normal; + color: #555555; +} +.ui-state-default a, +.ui-state-default a:link, +.ui-state-default a:visited, +a.ui-button, +a:link.ui-button, +a:visited.ui-button, +.ui-button { + color: #555555; + text-decoration: none; +} +.ui-state-hover, +.ui-widget-content .ui-state-hover, +.ui-widget-header .ui-state-hover, +.ui-state-focus, +.ui-widget-content .ui-state-focus, +.ui-widget-header .ui-state-focus, +.ui-button:hover, +.ui-button:focus { + border: 1px solid #999999; + background: #dadada url("images/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x; + font-weight: normal; + color: #212121; +} +.ui-state-hover a, +.ui-state-hover a:hover, +.ui-state-hover a:link, +.ui-state-hover a:visited, +.ui-state-focus a, +.ui-state-focus a:hover, +.ui-state-focus a:link, +.ui-state-focus a:visited, +a.ui-button:hover, +a.ui-button:focus { + color: #212121; + text-decoration: none; +} + +.ui-visual-focus { + box-shadow: 0 0 3px 1px rgb(94, 158, 214); +} +.ui-state-active, +.ui-widget-content .ui-state-active, +.ui-widget-header .ui-state-active, +a.ui-button:active, +.ui-button:active, +.ui-button.ui-state-active:hover { + border: 1px solid #aaaaaa; + background: #ffffff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x; + font-weight: normal; + color: #212121; +} +.ui-icon-background, +.ui-state-active .ui-icon-background { + border: #aaaaaa; + background-color: #212121; +} +.ui-state-active a, +.ui-state-active a:link, +.ui-state-active a:visited { + color: #212121; + text-decoration: none; +} + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, +.ui-widget-content .ui-state-highlight, +.ui-widget-header .ui-state-highlight { + border: 1px solid #fcefa1; + background: #fbf9ee url("images/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% repeat-x; + color: #363636; +} +.ui-state-checked { + border: 1px solid #fcefa1; + background: #fbf9ee; +} +.ui-state-highlight a, +.ui-widget-content .ui-state-highlight a, +.ui-widget-header .ui-state-highlight a { + color: #363636; +} +.ui-state-error, +.ui-widget-content .ui-state-error, +.ui-widget-header .ui-state-error { + border: 1px solid #cd0a0a; + background: #fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x; + color: #cd0a0a; +} +.ui-state-error a, +.ui-widget-content .ui-state-error a, +.ui-widget-header .ui-state-error a { + color: #cd0a0a; +} +.ui-state-error-text, +.ui-widget-content .ui-state-error-text, +.ui-widget-header .ui-state-error-text { + color: #cd0a0a; +} +.ui-priority-primary, +.ui-widget-content .ui-priority-primary, +.ui-widget-header .ui-priority-primary { + font-weight: bold; +} +.ui-priority-secondary, +.ui-widget-content .ui-priority-secondary, +.ui-widget-header .ui-priority-secondary { + opacity: .7; + filter:Alpha(Opacity=70); /* support: IE8 */ + font-weight: normal; +} +.ui-state-disabled, +.ui-widget-content .ui-state-disabled, +.ui-widget-header .ui-state-disabled { + opacity: .35; + filter:Alpha(Opacity=35); /* support: IE8 */ + background-image: none; +} +.ui-state-disabled .ui-icon { + filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */ +} + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { + width: 16px; + height: 16px; +} +.ui-icon, +.ui-widget-content .ui-icon { + background-image: url("images/ui-icons_222222_256x240.png"); +} +.ui-widget-header .ui-icon { + background-image: url("images/ui-icons_222222_256x240.png"); +} +.ui-state-hover .ui-icon, +.ui-state-focus .ui-icon, +.ui-button:hover .ui-icon, +.ui-button:focus .ui-icon { + background-image: url("images/ui-icons_454545_256x240.png"); +} +.ui-state-active .ui-icon, +.ui-button:active .ui-icon { + background-image: url("images/ui-icons_454545_256x240.png"); +} +.ui-state-highlight .ui-icon, +.ui-button .ui-state-highlight.ui-icon { + background-image: url("images/ui-icons_2e83ff_256x240.png"); +} +.ui-state-error .ui-icon, +.ui-state-error-text .ui-icon { + background-image: url("images/ui-icons_cd0a0a_256x240.png"); +} +.ui-button .ui-icon { + background-image: url("images/ui-icons_888888_256x240.png"); +} + +/* positioning */ +.ui-icon-blank { background-position: 16px 16px; } +.ui-icon-caret-1-n { background-position: 0 0; } +.ui-icon-caret-1-ne { background-position: -16px 0; } +.ui-icon-caret-1-e { background-position: -32px 0; } +.ui-icon-caret-1-se { background-position: -48px 0; } +.ui-icon-caret-1-s { background-position: -65px 0; } +.ui-icon-caret-1-sw { background-position: -80px 0; } +.ui-icon-caret-1-w { background-position: -96px 0; } +.ui-icon-caret-1-nw { background-position: -112px 0; } +.ui-icon-caret-2-n-s { background-position: -128px 0; } +.ui-icon-caret-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -65px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -65px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 1px -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-on { background-position: -96px -144px; } +.ui-icon-radio-off { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-start { background-position: -80px -160px; } +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-all, +.ui-corner-top, +.ui-corner-left, +.ui-corner-tl { + border-top-left-radius: 4px; +} +.ui-corner-all, +.ui-corner-top, +.ui-corner-right, +.ui-corner-tr { + border-top-right-radius: 4px; +} +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-left, +.ui-corner-bl { + border-bottom-left-radius: 4px; +} +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-right, +.ui-corner-br { + border-bottom-right-radius: 4px; +} + +/* Overlays */ +.ui-widget-overlay { + background: #aaaaaa; + opacity: .3; + filter: Alpha(Opacity=30); /* support: IE8 */ +} +.ui-widget-shadow { + -webkit-box-shadow: -8px -8px 8px #aaaaaa; + box-shadow: -8px -8px 8px #aaaaaa; +} diff --git a/test/fixtures/jquery-ui-1.13.3/themes/smoothness.css b/test/fixtures/jquery-ui-1.13.3/themes/smoothness.css new file mode 100644 index 00000000..812c3548 --- /dev/null +++ b/test/fixtures/jquery-ui-1.13.3/themes/smoothness.css @@ -0,0 +1,446 @@ +/*! + * jQuery UI CSS Framework 1.13.3 + * https://jqueryui.com + * + * Copyright OpenJS Foundation and other contributors + * Released under the MIT license. + * https://jquery.org/license + * + * https://api.jqueryui.com/category/theming/ + * + * To view and modify this theme, visit https://jqueryui.com/themeroller/?cornerRadiusShadow=8px&offsetLeftShadow=-8px&offsetTopShadow=-8px&thicknessShadow=8px&opacityShadow=30&bgImgOpacityShadow=0&bgTextureShadow=flat&bgColorShadow=aaaaaa&opacityOverlay=30&bgImgOpacityOverlay=0&bgTextureOverlay=flat&bgColorOverlay=aaaaaa&iconColorError=cd0a0a&fcError=cd0a0a&borderColorError=cd0a0a&bgImgOpacityError=95&bgTextureError=glass&bgColorError=fef1ec&iconColorHighlight=2e83ff&fcHighlight=363636&borderColorHighlight=fcefa1&bgImgOpacityHighlight=55&bgTextureHighlight=glass&bgColorHighlight=fbf9ee&iconColorActive=454545&fcActive=212121&borderColorActive=aaaaaa&bgImgOpacityActive=65&bgTextureActive=glass&bgColorActive=ffffff&iconColorHover=454545&fcHover=212121&borderColorHover=999999&bgImgOpacityHover=75&bgTextureHover=glass&bgColorHover=dadada&iconColorDefault=888888&fcDefault=555555&borderColorDefault=d3d3d3&bgImgOpacityDefault=75&bgTextureDefault=glass&bgColorDefault=e6e6e6&iconColorContent=222222&fcContent=222222&borderColorContent=aaaaaa&bgImgOpacityContent=75&bgTextureContent=flat&bgColorContent=ffffff&iconColorHeader=222222&fcHeader=222222&borderColorHeader=aaaaaa&bgImgOpacityHeader=75&bgTextureHeader=highlight_soft&bgColorHeader=cccccc&cornerRadius=4px&fsDefault=1.1em&fwDefault=normal&ffDefault=Verdana%2CArial%2Csans-serif + */ + + +/* Component containers +----------------------------------*/ +.ui-widget { + font-family: Verdana,Arial,sans-serif; + font-size: 1.1em; +} +.ui-widget .ui-widget { + font-size: 1em; +} +.ui-widget input, +.ui-widget select, +.ui-widget textarea, +.ui-widget button { + font-family: Verdana,Arial,sans-serif; + font-size: 1em; +} +.ui-widget.ui-widget-content { + border: 1px solid #d3d3d3; +} +.ui-widget-content { + border: 1px solid #aaaaaa; + background: #ffffff; + color: #222222; +} +.ui-widget-content a { + color: #222222; +} +.ui-widget-header { + border: 1px solid #aaaaaa; + background: #cccccc url("images/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x; + color: #222222; + font-weight: bold; +} +.ui-widget-header a { + color: #222222; +} + +/* Interaction states +----------------------------------*/ +.ui-state-default, +.ui-widget-content .ui-state-default, +.ui-widget-header .ui-state-default, +.ui-button, + +/* We use html here because we need a greater specificity to make sure disabled +works properly when clicked or hovered */ +html .ui-button.ui-state-disabled:hover, +html .ui-button.ui-state-disabled:active { + border: 1px solid #d3d3d3; + background: #e6e6e6 url("images/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x; + font-weight: normal; + color: #555555; +} +.ui-state-default a, +.ui-state-default a:link, +.ui-state-default a:visited, +a.ui-button, +a:link.ui-button, +a:visited.ui-button, +.ui-button { + color: #555555; + text-decoration: none; +} +.ui-state-hover, +.ui-widget-content .ui-state-hover, +.ui-widget-header .ui-state-hover, +.ui-state-focus, +.ui-widget-content .ui-state-focus, +.ui-widget-header .ui-state-focus, +.ui-button:hover, +.ui-button:focus { + border: 1px solid #999999; + background: #dadada url("images/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x; + font-weight: normal; + color: #212121; +} +.ui-state-hover a, +.ui-state-hover a:hover, +.ui-state-hover a:link, +.ui-state-hover a:visited, +.ui-state-focus a, +.ui-state-focus a:hover, +.ui-state-focus a:link, +.ui-state-focus a:visited, +a.ui-button:hover, +a.ui-button:focus { + color: #212121; + text-decoration: none; +} + +.ui-visual-focus { + box-shadow: 0 0 3px 1px rgb(94, 158, 214); +} +.ui-state-active, +.ui-widget-content .ui-state-active, +.ui-widget-header .ui-state-active, +a.ui-button:active, +.ui-button:active, +.ui-button.ui-state-active:hover { + border: 1px solid #aaaaaa; + background: #ffffff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x; + font-weight: normal; + color: #212121; +} +.ui-icon-background, +.ui-state-active .ui-icon-background { + border: #aaaaaa; + background-color: #212121; +} +.ui-state-active a, +.ui-state-active a:link, +.ui-state-active a:visited { + color: #212121; + text-decoration: none; +} + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, +.ui-widget-content .ui-state-highlight, +.ui-widget-header .ui-state-highlight { + border: 1px solid #fcefa1; + background: #fbf9ee url("images/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% repeat-x; + color: #363636; +} +.ui-state-checked { + border: 1px solid #fcefa1; + background: #fbf9ee; +} +.ui-state-highlight a, +.ui-widget-content .ui-state-highlight a, +.ui-widget-header .ui-state-highlight a { + color: #363636; +} +.ui-state-error, +.ui-widget-content .ui-state-error, +.ui-widget-header .ui-state-error { + border: 1px solid #cd0a0a; + background: #fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x; + color: #cd0a0a; +} +.ui-state-error a, +.ui-widget-content .ui-state-error a, +.ui-widget-header .ui-state-error a { + color: #cd0a0a; +} +.ui-state-error-text, +.ui-widget-content .ui-state-error-text, +.ui-widget-header .ui-state-error-text { + color: #cd0a0a; +} +.ui-priority-primary, +.ui-widget-content .ui-priority-primary, +.ui-widget-header .ui-priority-primary { + font-weight: bold; +} +.ui-priority-secondary, +.ui-widget-content .ui-priority-secondary, +.ui-widget-header .ui-priority-secondary { + opacity: .7; + -ms-filter: "alpha(opacity=70)"; /* support: IE8 */ + font-weight: normal; +} +.ui-state-disabled, +.ui-widget-content .ui-state-disabled, +.ui-widget-header .ui-state-disabled { + opacity: .35; + -ms-filter: "alpha(opacity=35)"; /* support: IE8 */ + background-image: none; +} +.ui-state-disabled .ui-icon { + -ms-filter: "alpha(opacity=35)"; /* support: IE8 - See #6059 */ +} + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { + width: 16px; + height: 16px; +} +.ui-icon, +.ui-widget-content .ui-icon { + background-image: url("images/ui-icons_222222_256x240.png"); +} +.ui-widget-header .ui-icon { + background-image: url("images/ui-icons_222222_256x240.png"); +} +.ui-state-hover .ui-icon, +.ui-state-focus .ui-icon, +.ui-button:hover .ui-icon, +.ui-button:focus .ui-icon { + background-image: url("images/ui-icons_454545_256x240.png"); +} +.ui-state-active .ui-icon, +.ui-button:active .ui-icon { + background-image: url("images/ui-icons_454545_256x240.png"); +} +.ui-state-highlight .ui-icon, +.ui-button .ui-state-highlight.ui-icon { + background-image: url("images/ui-icons_2e83ff_256x240.png"); +} +.ui-state-error .ui-icon, +.ui-state-error-text .ui-icon { + background-image: url("images/ui-icons_cd0a0a_256x240.png"); +} +.ui-button .ui-icon { + background-image: url("images/ui-icons_888888_256x240.png"); +} + +/* positioning */ +/* Three classes needed to override `.ui-button:hover .ui-icon` */ +.ui-icon-blank.ui-icon-blank.ui-icon-blank { + background-image: none; +} +.ui-icon-caret-1-n { background-position: 0 0; } +.ui-icon-caret-1-ne { background-position: -16px 0; } +.ui-icon-caret-1-e { background-position: -32px 0; } +.ui-icon-caret-1-se { background-position: -48px 0; } +.ui-icon-caret-1-s { background-position: -65px 0; } +.ui-icon-caret-1-sw { background-position: -80px 0; } +.ui-icon-caret-1-w { background-position: -96px 0; } +.ui-icon-caret-1-nw { background-position: -112px 0; } +.ui-icon-caret-2-n-s { background-position: -128px 0; } +.ui-icon-caret-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -65px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -65px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 1px -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-on { background-position: -96px -144px; } +.ui-icon-radio-off { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-start { background-position: -80px -160px; } +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-all, +.ui-corner-top, +.ui-corner-left, +.ui-corner-tl { + border-top-left-radius: 4px; +} +.ui-corner-all, +.ui-corner-top, +.ui-corner-right, +.ui-corner-tr { + border-top-right-radius: 4px; +} +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-left, +.ui-corner-bl { + border-bottom-left-radius: 4px; +} +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-right, +.ui-corner-br { + border-bottom-right-radius: 4px; +} + +/* Overlays */ +.ui-widget-overlay { + background: #aaaaaa; + opacity: .3; + -ms-filter: "alpha(opacity=30)"; /* support: IE8 */ +} +.ui-widget-shadow { + -webkit-box-shadow: -8px -8px 8px #aaaaaa; + box-shadow: -8px -8px 8px #aaaaaa; +} diff --git a/test/fixtures/jquery-ui-1.14.1/themes/smoothness.css b/test/fixtures/jquery-ui-1.14.1/themes/smoothness.css new file mode 100644 index 00000000..e98d8d97 --- /dev/null +++ b/test/fixtures/jquery-ui-1.14.1/themes/smoothness.css @@ -0,0 +1,439 @@ +/*! + * jQuery UI CSS Framework 1.14.1 + * https://jqueryui.com + * + * Copyright OpenJS Foundation and other contributors + * Released under the MIT license. + * https://jquery.org/license + * + * https://api.jqueryui.com/category/theming/ + * + * To view and modify this theme, visit https://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px + */ + + +/* Component containers +----------------------------------*/ +.ui-widget { + font-family: Verdana,Arial,sans-serif; + font-size: 1.1em; +} +.ui-widget .ui-widget { + font-size: 1em; +} +.ui-widget input, +.ui-widget select, +.ui-widget textarea, +.ui-widget button { + font-family: Verdana,Arial,sans-serif; + font-size: 1em; +} +.ui-widget.ui-widget-content { + border: 1px solid #d3d3d3; +} +.ui-widget-content { + border: 1px solid #aaaaaa; + background: #ffffff; + color: #222222; +} +.ui-widget-content a { + color: #222222; +} +.ui-widget-header { + border: 1px solid #aaaaaa; + background: #cccccc url("images/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x; + color: #222222; + font-weight: bold; +} +.ui-widget-header a { + color: #222222; +} + +/* Interaction states +----------------------------------*/ +.ui-state-default, +.ui-widget-content .ui-state-default, +.ui-widget-header .ui-state-default, +.ui-button, + +/* We use html here because we need a greater specificity to make sure disabled +works properly when clicked or hovered */ +html .ui-button.ui-state-disabled:hover, +html .ui-button.ui-state-disabled:active { + border: 1px solid #d3d3d3; + background: #e6e6e6 url("images/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x; + font-weight: normal; + color: #555555; +} +.ui-state-default a, +.ui-state-default a:link, +.ui-state-default a:visited, +a.ui-button, +a:link.ui-button, +a:visited.ui-button, +.ui-button { + color: #555555; + text-decoration: none; +} +.ui-state-hover, +.ui-widget-content .ui-state-hover, +.ui-widget-header .ui-state-hover, +.ui-state-focus, +.ui-widget-content .ui-state-focus, +.ui-widget-header .ui-state-focus, +.ui-button:hover, +.ui-button:focus { + border: 1px solid #999999; + background: #dadada url("images/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x; + font-weight: normal; + color: #212121; +} +.ui-state-hover a, +.ui-state-hover a:hover, +.ui-state-hover a:link, +.ui-state-hover a:visited, +.ui-state-focus a, +.ui-state-focus a:hover, +.ui-state-focus a:link, +.ui-state-focus a:visited, +a.ui-button:hover, +a.ui-button:focus { + color: #212121; + text-decoration: none; +} + +.ui-visual-focus { + box-shadow: 0 0 3px 1px rgb(94, 158, 214); +} +.ui-state-active, +.ui-widget-content .ui-state-active, +.ui-widget-header .ui-state-active, +a.ui-button:active, +.ui-button:active, +.ui-button.ui-state-active:hover { + border: 1px solid #aaaaaa; + background: #ffffff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x; + font-weight: normal; + color: #212121; +} +.ui-icon-background, +.ui-state-active .ui-icon-background { + border: #aaaaaa; + background-color: #212121; +} +.ui-state-active a, +.ui-state-active a:link, +.ui-state-active a:visited { + color: #212121; + text-decoration: none; +} + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, +.ui-widget-content .ui-state-highlight, +.ui-widget-header .ui-state-highlight { + border: 1px solid #fcefa1; + background: #fbf9ee url("images/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% repeat-x; + color: #363636; +} +.ui-state-checked { + border: 1px solid #fcefa1; + background: #fbf9ee; +} +.ui-state-highlight a, +.ui-widget-content .ui-state-highlight a, +.ui-widget-header .ui-state-highlight a { + color: #363636; +} +.ui-state-error, +.ui-widget-content .ui-state-error, +.ui-widget-header .ui-state-error { + border: 1px solid #cd0a0a; + background: #fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x; + color: #cd0a0a; +} +.ui-state-error a, +.ui-widget-content .ui-state-error a, +.ui-widget-header .ui-state-error a { + color: #cd0a0a; +} +.ui-state-error-text, +.ui-widget-content .ui-state-error-text, +.ui-widget-header .ui-state-error-text { + color: #cd0a0a; +} +.ui-priority-primary, +.ui-widget-content .ui-priority-primary, +.ui-widget-header .ui-priority-primary { + font-weight: bold; +} +.ui-priority-secondary, +.ui-widget-content .ui-priority-secondary, +.ui-widget-header .ui-priority-secondary { + opacity: .7; + font-weight: normal; +} +.ui-state-disabled, +.ui-widget-content .ui-state-disabled, +.ui-widget-header .ui-state-disabled { + opacity: .35; + background-image: none; +} + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { + width: 16px; + height: 16px; +} +.ui-icon, +.ui-widget-content .ui-icon { + background-image: url("images/ui-icons_222222_256x240.png"); +} +.ui-widget-header .ui-icon { + background-image: url("images/ui-icons_222222_256x240.png"); +} +.ui-state-hover .ui-icon, +.ui-state-focus .ui-icon, +.ui-button:hover .ui-icon, +.ui-button:focus .ui-icon { + background-image: url("images/ui-icons_454545_256x240.png"); +} +.ui-state-active .ui-icon, +.ui-button:active .ui-icon { + background-image: url("images/ui-icons_454545_256x240.png"); +} +.ui-state-highlight .ui-icon, +.ui-button .ui-state-highlight.ui-icon { + background-image: url("images/ui-icons_2e83ff_256x240.png"); +} +.ui-state-error .ui-icon, +.ui-state-error-text .ui-icon { + background-image: url("images/ui-icons_cd0a0a_256x240.png"); +} +.ui-button .ui-icon { + background-image: url("images/ui-icons_888888_256x240.png"); +} + +/* positioning */ +/* Three classes needed to override `.ui-button:hover .ui-icon` */ +.ui-icon-blank.ui-icon-blank.ui-icon-blank { + background-image: none; +} +.ui-icon-caret-1-n { background-position: 0 0; } +.ui-icon-caret-1-ne { background-position: -16px 0; } +.ui-icon-caret-1-e { background-position: -32px 0; } +.ui-icon-caret-1-se { background-position: -48px 0; } +.ui-icon-caret-1-s { background-position: -65px 0; } +.ui-icon-caret-1-sw { background-position: -80px 0; } +.ui-icon-caret-1-w { background-position: -96px 0; } +.ui-icon-caret-1-nw { background-position: -112px 0; } +.ui-icon-caret-2-n-s { background-position: -128px 0; } +.ui-icon-caret-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -65px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -65px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 1px -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-on { background-position: -96px -144px; } +.ui-icon-radio-off { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-start { background-position: -80px -160px; } +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-all, +.ui-corner-top, +.ui-corner-left, +.ui-corner-tl { + border-top-left-radius: 4px; +} +.ui-corner-all, +.ui-corner-top, +.ui-corner-right, +.ui-corner-tr { + border-top-right-radius: 4px; +} +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-left, +.ui-corner-bl { + border-bottom-left-radius: 4px; +} +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-right, +.ui-corner-br { + border-bottom-right-radius: 4px; +} + +/* Overlays */ +.ui-widget-overlay { + background: #aaaaaa; + opacity: .3; +} +.ui-widget-shadow { + box-shadow: -8px -8px 8px #aaaaaa; +} diff --git a/test/fixtures/vars/base.json b/test/fixtures/vars/base.json new file mode 100644 index 00000000..ed083966 --- /dev/null +++ b/test/fixtures/vars/base.json @@ -0,0 +1,53 @@ +{ + "ffDefault": "Arial,Helvetica,sans-serif", + "fsDefault": "1em", + "fwDefault": "normal", + "cornerRadius": "3px", + "bgColorHeader": "e9e9e9", + "bgTextureHeader": "flat", + "borderColorHeader": "dddddd", + "fcHeader": "333333", + "iconColorHeader": "444444", + "bgColorContent": "ffffff", + "bgTextureContent": "flat", + "borderColorContent": "dddddd", + "fcContent": "333333", + "iconColorContent": "444444", + "bgColorDefault": "f6f6f6", + "bgTextureDefault": "flat", + "borderColorDefault": "c5c5c5", + "fcDefault": "454545", + "iconColorDefault": "777777", + "bgColorHover": "ededed", + "bgTextureHover": "flat", + "borderColorHover": "cccccc", + "fcHover": "2b2b2b", + "iconColorHover": "555555", + "bgColorActive": "007fff", + "bgTextureActive": "flat", + "borderColorActive": "003eff", + "fcActive": "ffffff", + "iconColorActive": "ffffff", + "bgColorHighlight": "fffa90", + "bgTextureHighlight": "flat", + "borderColorHighlight": "dad55e", + "fcHighlight": "777620", + "iconColorHighlight": "777620", + "bgColorError": "fddfdf", + "bgTextureError": "flat", + "borderColorError": "f1a899", + "fcError": "5f3f3f", + "iconColorError": "cc0000", + "bgColorOverlay": "aaaaaa", + "bgTextureOverlay": "flat", + "bgImgOpacityOverlay": "0", + "opacityOverlay": "30", + "bgColorShadow": "666666", + "bgTextureShadow": "flat", + "bgImgOpacityShadow": "0", + "opacityShadow": "30", + "thicknessShadow": "5px", + "offsetTopShadow": "0px", + "offsetLeftShadow": "0px", + "cornerRadiusShadow": "8px" +} diff --git a/test/fixtures/vars/smoothness.json b/test/fixtures/vars/smoothness.json new file mode 100644 index 00000000..a614e648 --- /dev/null +++ b/test/fixtures/vars/smoothness.json @@ -0,0 +1,60 @@ +{ + "ffDefault": "Verdana,Arial,sans-serif", + "fwDefault": "normal", + "fsDefault": "1.1em", + "cornerRadius": "4px", + "bgColorHeader": "cccccc", + "bgTextureHeader": "highlight_soft", + "bgImgOpacityHeader": "75", + "borderColorHeader": "aaaaaa", + "fcHeader": "222222", + "iconColorHeader": "222222", + "bgColorContent": "ffffff", + "bgTextureContent": "flat", + "bgImgOpacityContent": "75", + "borderColorContent": "aaaaaa", + "fcContent": "222222", + "iconColorContent": "222222", + "bgColorDefault": "e6e6e6", + "bgTextureDefault": "glass", + "bgImgOpacityDefault": "75", + "borderColorDefault": "d3d3d3", + "fcDefault": "555555", + "iconColorDefault": "888888", + "bgColorHover": "dadada", + "bgTextureHover": "glass", + "bgImgOpacityHover": "75", + "borderColorHover": "999999", + "fcHover": "212121", + "iconColorHover": "454545", + "bgColorActive": "ffffff", + "bgTextureActive": "glass", + "bgImgOpacityActive": "65", + "borderColorActive": "aaaaaa", + "fcActive": "212121", + "iconColorActive": "454545", + "bgColorHighlight": "fbf9ee", + "bgTextureHighlight": "glass", + "bgImgOpacityHighlight": "55", + "borderColorHighlight": "fcefa1", + "fcHighlight": "363636", + "iconColorHighlight": "2e83ff", + "bgColorError": "fef1ec", + "bgTextureError": "glass", + "bgImgOpacityError": "95", + "borderColorError": "cd0a0a", + "fcError": "cd0a0a", + "iconColorError": "cd0a0a", + "bgColorOverlay": "aaaaaa", + "bgTextureOverlay": "flat", + "bgImgOpacityOverlay": "0", + "opacityOverlay": "30", + "bgColorShadow": "aaaaaa", + "bgTextureShadow": "flat", + "bgImgOpacityShadow": "0", + "opacityShadow": "30", + "thicknessShadow": "8px", + "offsetTopShadow": "-8px", + "offsetLeftShadow": "-8px", + "cornerRadiusShadow": "8px" +} diff --git a/test/fixtures/vars/ui-darkness.json b/test/fixtures/vars/ui-darkness.json new file mode 100644 index 00000000..b624585f --- /dev/null +++ b/test/fixtures/vars/ui-darkness.json @@ -0,0 +1,60 @@ +{ + "ffDefault": "Segoe UI,Arial,sans-serif", + "fwDefault": "bold", + "fsDefault": "1.1em", + "cornerRadius": "6px", + "bgColorHeader": "333333", + "bgTextureHeader": "gloss_wave", + "bgImgOpacityHeader": "25", + "borderColorHeader": "333333", + "fcHeader": "ffffff", + "iconColorHeader": "ffffff", + "bgColorContent": "000000", + "bgTextureContent": "inset_soft", + "bgImgOpacityContent": "25", + "borderColorContent": "666666", + "fcContent": "ffffff", + "iconColorContent": "cccccc", + "bgColorDefault": "555555", + "bgTextureDefault": "glass", + "bgImgOpacityDefault": "20", + "borderColorDefault": "666666", + "fcDefault": "eeeeee", + "iconColorDefault": "cccccc", + "bgColorHover": "0078a3", + "bgTextureHover": "glass", + "bgImgOpacityHover": "40", + "borderColorHover": "59b4d4", + "fcHover": "ffffff", + "iconColorHover": "ffffff", + "bgColorActive": "f58400", + "bgTextureActive": "inset_soft", + "bgImgOpacityActive": "30", + "borderColorActive": "ffaf0f", + "fcActive": "ffffff", + "iconColorActive": "222222", + "bgColorHighlight": "eeeeee", + "bgTextureHighlight": "highlight_soft", + "bgImgOpacityHighlight": "80", + "borderColorHighlight": "cccccc", + "fcHighlight": "2e7db2", + "iconColorHighlight": "4b8e0b", + "bgColorError": "ffc73d", + "bgTextureError": "glass", + "bgImgOpacityError": "40", + "borderColorError": "ffb73d", + "fcError": "111111", + "iconColorError": "a83300", + "bgColorOverlay": "5c5c5c", + "bgTextureOverlay": "flat", + "bgImgOpacityOverlay": "50", + "opacityOverlay": "80", + "bgColorShadow": "cccccc", + "bgTextureShadow": "flat", + "bgImgOpacityShadow": "30", + "opacityShadow": "60", + "thicknessShadow": "7px", + "offsetTopShadow": "-7px", + "offsetLeftShadow": "-7px", + "cornerRadiusShadow": "8px" +} diff --git a/test/fixtures/vars/ui-lightness.json b/test/fixtures/vars/ui-lightness.json new file mode 100644 index 00000000..e7735d81 --- /dev/null +++ b/test/fixtures/vars/ui-lightness.json @@ -0,0 +1,60 @@ +{ + "ffDefault": "Trebuchet MS,Tahoma,Verdana,Arial,sans-serif", + "fwDefault": "bold", + "fsDefault": "1.1em", + "cornerRadius": "4px", + "bgColorHeader": "f6a828", + "bgTextureHeader": "gloss_wave", + "bgImgOpacityHeader": "35", + "borderColorHeader": "e78f08", + "fcHeader": "ffffff", + "iconColorHeader": "ffffff", + "bgColorContent": "eeeeee", + "bgTextureContent": "highlight_soft", + "bgImgOpacityContent": "100", + "borderColorContent": "dddddd", + "fcContent": "333333", + "iconColorContent": "222222", + "bgColorDefault": "f6f6f6", + "bgTextureDefault": "glass", + "bgImgOpacityDefault": "100", + "borderColorDefault": "cccccc", + "fcDefault": "1c94c4", + "iconColorDefault": "ef8c08", + "bgColorHover": "fdf5ce", + "bgTextureHover": "glass", + "bgImgOpacityHover": "100", + "borderColorHover": "fbcb09", + "fcHover": "c77405", + "iconColorHover": "ef8c08", + "bgColorActive": "ffffff", + "bgTextureActive": "glass", + "bgImgOpacityActive": "65", + "borderColorActive": "fbd850", + "fcActive": "eb8f00", + "iconColorActive": "ef8c08", + "bgColorHighlight": "ffe45c", + "bgTextureHighlight": "highlight_soft", + "bgImgOpacityHighlight": "75", + "borderColorHighlight": "fed22f", + "fcHighlight": "363636", + "iconColorHighlight": "228ef1", + "bgColorError": "b81900", + "bgTextureError": "diagonals_thick", + "bgImgOpacityError": "18", + "borderColorError": "cd0a0a", + "fcError": "ffffff", + "iconColorError": "ffd27a", + "bgColorOverlay": "666666", + "bgTextureOverlay": "diagonals_thick", + "bgImgOpacityOverlay": "20", + "opacityOverlay": "50", + "bgColorShadow": "000000", + "bgTextureShadow": "flat", + "bgImgOpacityShadow": "10", + "opacityShadow": "20", + "thicknessShadow": "5px", + "offsetTopShadow": "-5px", + "offsetLeftShadow": "-5px", + "cornerRadiusShadow": "5px" +} diff --git a/test/jquery-ui.js b/test/jquery-ui.js deleted file mode 100644 index 8a9bc1d5..00000000 --- a/test/jquery-ui.js +++ /dev/null @@ -1,76 +0,0 @@ -var JqueryUi = require( "../lib/jquery-ui" ); - -function notNull( data ) { - if ( data instanceof Buffer ) { - data = data.toString( "utf-8" ); - } - if ( typeof data === "string" && data.length > 0 ) { - return true; - } - return false; -} - -var tests = { - "test: common files present": function( test ) { - var files = this.jqueryUi.files(); - test.expect( files.commonFiles.length ); - files.commonFiles.forEach(function( file ) { - test.ok( notNull( file.data ), "Null file \"" + file.path + "\"." ); - }); - test.done(); - }, - "test: component files present": function( test ) { - var files = this.jqueryUi.files(); - test.expect( files.componentFiles.length ); - files.componentFiles.forEach(function( file ) { - test.ok( notNull( file.data ), "Null file \"" + file.path + "\"." ); - }); - test.done(); - }, - "test: demo files present": function( test ) { - var files = this.jqueryUi.files(); - test.expect( files.demoFiles.length ); - files.demoFiles.forEach(function( file ) { - test.ok( notNull( file.data ), "Null file \"" + file.path + "\"." ); - }); - test.done(); - }, - "test: doc files present": function( test ) { - var files = this.jqueryUi.files(); - test.expect( files.docFiles.length ); - files.docFiles.forEach(function( file ) { - test.ok( notNull( file.data ), "Null file \"" + file.path + "\"." ); - }); - test.done(); - }, - "test: base theme files present": function( test ) { - var files = this.jqueryUi.files(); - test.expect( files.baseThemeFiles.length ); - files.baseThemeFiles.forEach(function( file ) { - test.ok( notNull( file.data ), "Null file \"" + file.path + "\"." ); - }); - test.done(); - } -}; - -module.exports = {}; - -// Build tests for each jqueryUi release -JqueryUi.all().forEach(function( jqueryUi ) { - function deepTestBuild( obj, tests ) { - Object.keys( tests ).forEach(function( i ) { - if ( typeof tests[ i ] === "object" ) { - obj[ i ] = {}; - deepTestBuild( obj[ i ], tests[ i ] ); - } else { - obj[ i ] = function( test ) { - tests[ i ].call({ - jqueryUi: jqueryUi - }, test ); - }; - } - }); - } - module.exports[ jqueryUi.pkg.version ] = {}; - deepTestBuild( module.exports[ jqueryUi.pkg.version ], tests ); -}); diff --git a/test/lib/compare-images.js b/test/lib/compare-images.js new file mode 100644 index 00000000..4358d3a8 --- /dev/null +++ b/test/lib/compare-images.js @@ -0,0 +1,82 @@ +"use strict"; + +const fs = require( "node:fs" ); +const PNG = require( "pngjs" ).PNG; + +function compareParsedImages( imgA, imgE, delta = 0 ) { + + // Ensure both images have the same dimensions + if ( imgA.width !== imgE.width || imgA.height !== imgE.height ) { + return { + passed: false, + message: "Images have different dimensions" + }; + } + + // Loop over every pixel (each pixel occupies 4 positions in the data array) + for ( let y = 0; y < imgA.height; y++ ) { + for ( let x = 0; x < imgA.width; x++ ) { + + // Calculate the starting index for this pixel in the buffer using multiplication + const i = ( imgA.width * y + x ) * 4; + const rgbaA = { + r: imgA.data[ i ], + g: imgA.data[ i + 1 ], + b: imgA.data[ i + 2 ], + alpha: imgA.data[ i + 3 ] + }; + const rgbaE = { + r: imgE.data[ i ], + g: imgE.data[ i + 1 ], + b: imgE.data[ i + 2 ], + alpha: imgE.data[ i + 3 ] + }; + const rDiff = Math.abs( rgbaA.r - rgbaE.r ); + const gDiff = Math.abs( rgbaA.g - rgbaE.g ); + const bDiff = Math.abs( rgbaA.b - rgbaE.b ); + const alphaDiff = Math.abs( rgbaA.alpha - rgbaE.alpha ); + + if ( rDiff > delta || gDiff > delta || bDiff > delta || alphaDiff > delta ) { + return { + passed: false, + message: `Error at pixel (x: ${ x }, y: ${ y }): ` + + `Image actual: rgba(${ rgbaA.r }, ${ rgbaA.g }, ${ rgbaA.b }, ${ rgbaA.alpha }) vs. ` + + `Image expected: rgba(${ rgbaE.r }, ${ rgbaE.g }, ${ rgbaE.b }, ${ rgbaE.alpha })` + }; + } + } + } + + return { + passed: true, + message: "Images sufficiently similar" + }; +} + +async function compareImages( pathActual, pathExpected, delta = 0 ) { + return new Promise( async( resolve, reject ) => { + const bufferActual = fs.readFileSync( pathActual ); + const bufferExpected = fs.readFileSync( pathExpected ); + const [ imgActual, imgExpected ] = await Promise + .all( + [ + bufferActual, + bufferExpected + ].map( buffer => new Promise( ( res ) => { + new PNG( { filterType: 4 } ) + .parse( buffer, function( error, img ) { + if ( error ) { + reject( error ); + return; + } + res( img ); + } ); + } + ) ) + ); + + resolve( compareParsedImages( imgActual, imgExpected, delta ) ); + } ); +} + +module.exports = { compareImages }; diff --git a/test/package.js b/test/package.js new file mode 100644 index 00000000..5e4c81d7 --- /dev/null +++ b/test/package.js @@ -0,0 +1,316 @@ +"use strict"; + +QUnit.module( "package" ); + +let defaultTheme, someWidgets1, someWidgets2, + commonFiles, COMMON_FILES_TESTCASES, + themeFiles, THEME_FILES_TESTCASES, + es5Files, ES5_FILES_TESTCASES; +const JqueryUi = require( "../lib/jquery-ui" ); +const Package = require( "../lib/package" ); +const Packager = require( "node-packager" ); +const themeGallery = require( "../lib/themeroller-themegallery" )(); +const { ESLint } = require( "eslint" ); + +function findFilepath( files, filepath ) { + const filepathRe = filepath instanceof RegExp ? + filepath : + new RegExp( + filepath + .replace( /\*/g, "[^\/]*" ) + .replace( /\./g, "\\." ) + .replace( /(.*)/, "^$1$" ) + ); + return Object.keys( files ).find( function( filepath ) { + return filepathRe.test( filepath ); + } ); +} + +// An ESLint instance meant just to test if provided files are in ES5. +// Use via the `ensureEs5` function. +const eslintEs5 = new ESLint( { + + // Disable searching for config files + overrideConfigFile: true, + + overrideConfig: { + + // Match all files. We will run it only on code we want anyway. + files: [ "*" ], + + languageOptions: { + ecmaVersion: 5, + sourceType: "script" + }, + + linterOptions: { + noInlineConfig: true, + reportUnusedDisableDirectives: "off", + reportUnusedInlineConfigs: "off" + } + } +} ); + +async function ensureEs5( contents ) { + const results = await eslintEs5.lintText( contents ); + if ( results[ 0 ].errorCount === 0 ) { + return { success: true }; + } + + return { + success: false, + message: results[ 0 ].messages.map( msgData => msgData.message ).join( "\n" ) + }; +} + +defaultTheme = themeGallery[ 0 ].vars; +someWidgets1 = "widget position widgets/autocomplete widgets/button widgets/menu widgets/progressbar widgets/spinner widgets/tabs".split( " " ); +someWidgets2 = "widget widgets/mouse position widgets/draggable widgets/resizable widgets/button widgets/datepicker widgets/dialog widgets/slider widgets/tooltip".split( " " ); + +commonFiles = [ + "external/jquery/jquery.js", + "index.html", + "jquery-ui.css", + "jquery-ui.js", + "jquery-ui.min.css", + "jquery-ui.min.js", + "jquery-ui.structure.css", + "jquery-ui.structure.min.css" +]; +COMMON_FILES_TESTCASES = commonFiles.length; +function commonFilesCheck( assert, files ) { + commonFiles.forEach( function( filepath ) { + assert.ok( !!findFilepath( files, filepath ), "A common file \"" + filepath + "\" present." ); + } ); +} + +es5Files = [ + "jquery-ui.js", + "jquery-ui.min.js" +]; +ES5_FILES_TESTCASES = es5Files.length * 2; +async function es5FilesCheck( assert, files ) { + for ( const filepathPattern of es5Files ) { + const filepath = findFilepath( files, filepathPattern ); + assert.ok( !!filepath, "A JS file \"" + filepath + "\" present." ); + const lintResult = await ensureEs5( files[ filepath ] ); + assert.ok( lintResult.success, `JS file "${ filepath }" needs to be in ES5 format.${ + lintResult.success ? "" : `Messages from ESLint:\n${ lintResult.message }` + }` ); + } +} + +themeFiles = [ + "jquery-ui.theme.css", + "jquery-ui.theme.min.css", + "images/ui-icons*png" +]; +THEME_FILES_TESTCASES = themeFiles.length; +function themeFilesCheck( assert, files, theme ) { + themeFiles.forEach( function( filepath ) { + if ( theme ) { + assert.ok( !!findFilepath( files, filepath ), "A theme file \"" + filepath + "\" present." ); + } else { + assert.ok( !findFilepath( files, filepath ), "The theme file \"" + filepath + "\" not included." ); + } + } ); +} + +function runTests( context, jQueryUiVersion ) { + + QUnit.test( `[${ jQueryUiVersion }]: select all components with the default theme`, function( assert ) { + assert.expect( COMMON_FILES_TESTCASES + ES5_FILES_TESTCASES + THEME_FILES_TESTCASES ); + + return new Promise( ( resolve, reject ) => { + const pkg = new Packager( context.files, Package, { + components: context.allComponents, + themeVars: defaultTheme + } ); + pkg.toJson( async function( error, files ) { + debugger; + if ( error ) { + return reject( error ); + } + commonFilesCheck( assert, files ); + await es5FilesCheck( assert, files ); + themeFilesCheck( assert, files, true ); + resolve(); + } ); + } ); + } ); + + QUnit.test( `[${ jQueryUiVersion }]: select all components with a different theme`, function( assert ) { + assert.expect( COMMON_FILES_TESTCASES + ES5_FILES_TESTCASES + THEME_FILES_TESTCASES ); + + return new Promise( ( resolve, reject ) => { + const pkg = new Packager( context.files, Package, { + components: context.allComponents, + themeVars: themeGallery[ 1 ].vars + } ); + pkg.toJson( async function( error, files ) { + if ( error ) { + return reject( error ); + } + commonFilesCheck( assert, files ); + await es5FilesCheck( assert, files ); + themeFilesCheck( assert, files, true ); + resolve(); + } ); + } ); + } ); + + QUnit.test( `[${ jQueryUiVersion }]: test: select all widgets`, function( assert ) { + assert.expect( COMMON_FILES_TESTCASES + ES5_FILES_TESTCASES + THEME_FILES_TESTCASES + 2 ); + + return new Promise( ( resolve, reject ) => { + const allWidgets = context.allWidgets; + const pkg = new Packager( context.files, Package, { + components: allWidgets, + themeVars: defaultTheme + } ); + assert.strictEqual( allWidgets.length, 15, "All widgets count" ); + pkg.toJson( async function( error, files ) { + if ( error ) { + return reject( error ); + } + commonFilesCheck( assert, files ); + await es5FilesCheck( assert, files ); + themeFilesCheck( assert, files, true ); + + // 15 widgets, 14 have CSS, plus core, theme, draggable, resizable + const includes = files[ "jquery-ui.min.css" ].match( /\* Includes: (.+)/ ); + assert.strictEqual( includes[ 1 ].split( "," ).length, 18, allWidgets + " -> " + includes[ 1 ] ); + + resolve(); + } ); + } ); + } ); + + QUnit.test( `[${ jQueryUiVersion }]: test: select all effects`, function( assert ) { + assert.expect( COMMON_FILES_TESTCASES + ES5_FILES_TESTCASES + THEME_FILES_TESTCASES + 1 ); + + return new Promise( ( resolve, reject ) => { + const pkg = new Packager( context.files, Package, { + components: context.allEffects, + themeVars: null + } ); + assert.strictEqual( context.allEffects.length, 16, "All effects count" ); + pkg.toJson( async function( error, files ) { + if ( error ) { + return reject( error ); + } + commonFilesCheck( assert, files ); + await es5FilesCheck( assert, files ); + themeFilesCheck( assert, files, false ); + resolve(); + } ); + } ); + } ); + + QUnit.test( `[${ jQueryUiVersion }]: select some widgets (1)`, function( assert ) { + assert.expect( COMMON_FILES_TESTCASES + ES5_FILES_TESTCASES + THEME_FILES_TESTCASES + 2 ); + + return new Promise( ( resolve, reject ) => { + const pkg = new Packager( context.files, Package, { + components: someWidgets1, + themeVars: defaultTheme + } ); + assert.strictEqual( someWidgets1.length, 8, "Some widgets count" ); + pkg.toJson( async function( error, files ) { + if ( error ) { + return reject( error ); + } + commonFilesCheck( assert, files ); + await es5FilesCheck( assert, files ); + themeFilesCheck( assert, files, true ); + + // 8 components selected, 6 have CSS, plus core, theme, + // checkboxradio, controlgroup (tmp button dependencies) + const includes = files[ "jquery-ui.min.css" ].match( /\* Includes: (.+)/ ); + assert.strictEqual( includes[ 1 ].split( "," ).length, 10, someWidgets1 + " -> " + includes[ 1 ] ); + + resolve(); + } ); + } ); + } ); + + QUnit.test( `[${ jQueryUiVersion }]: select some widgets (2)`, function( assert ) { + assert.expect( COMMON_FILES_TESTCASES + ES5_FILES_TESTCASES + THEME_FILES_TESTCASES + 2 ); + + return new Promise( ( resolve, reject ) => { + const pkg = new Packager( context.files, Package, { + components: someWidgets2, + themeVars: defaultTheme + } ); + assert.strictEqual( someWidgets2.length, 10, "Some widgets count" ); + pkg.toJson( async function( error, files ) { + if ( error ) { + return reject( error ); + } + commonFilesCheck( assert, files ); + await es5FilesCheck( assert, files ); + themeFilesCheck( assert, files, true ); + + // 10 components selected, 7 have CSS, plus core, theme, + // checkboxradio, controlgroup (tmp button dependencies) + const includes = files[ "jquery-ui.min.css" ].match( /\* Includes: (.+)/ ); + assert.strictEqual( includes[ 1 ].split( "," ).length, 11, someWidgets2 + " -> " + includes[ 1 ] ); + + resolve(); + } ); + } ); + } ); + + QUnit.test( `[${ jQueryUiVersion }]: scope widget CSS`, function( assert ) { + const filesToCheck = [ + "jquery-ui.css", + "jquery-ui.min.css" + ]; + + assert.expect( filesToCheck.length ); + + return new Promise( ( resolve, reject ) => { + const scope = "#wrapper"; + const scopeRe = new RegExp( scope ); + const pkg = new Packager( context.files, Package, { + components: context.allComponents, + themeVars: defaultTheme, + scope: scope + } ); + pkg.toJson( function( error, files ) { + if ( error ) { + return reject( error ); + } + filesToCheck.forEach( function( filepath ) { + assert.ok( scopeRe.test( files[ filepath ] ), "Scope selector on \"" + filepath + "\" present." ); + } ); + resolve(); + } ); + } ); + } ); +} + +JqueryUi.all().forEach( function( jqueryUi ) { + const allComponents = jqueryUi.components().map( component => component.name ); + + const allEffects = jqueryUi.components() + .filter( component => component.category === "Effects" ) + .map( component => component.name ); + + const allWidgets = jqueryUi.components() + .filter( component => component.category === "Widgets" ) + .map( component => component.name ) + .sort() + + // unique + .filter( ( element, i, arr ) => i === arr.indexOf( element ) ); + + const files = jqueryUi.files().cache; + + runTests( { + allComponents: allComponents, + allEffects: allEffects, + allWidgets: allWidgets, + files: files + }, jqueryUi.pkg.version ); +} ); diff --git a/test/packer.js b/test/packer.js deleted file mode 100644 index ebcb2071..00000000 --- a/test/packer.js +++ /dev/null @@ -1,653 +0,0 @@ -var Builder = require( "../lib/builder" ), - JqueryUi = require( "../lib/jquery-ui" ), - Packer = require( "../lib/packer" ), - semver = require( "semver" ), - ThemeRoller = require( "../lib/themeroller" ), - someWidgets1 = "widget core position autocomplete button menu progressbar spinner tabs".split( " " ), - someWidgets2 = "widget core mouse position draggable resizable button datepicker dialog slider tooltip".split( " " ), - noComponents = [], - invalidComponent = "invalid_widget"; - - -function filePresent( files, filepath ) { - var filepathRe = filepath instanceof RegExp ? filepath : new RegExp( filepath.replace( /\*/g, "[^\/]*" ).replace( /\./g, "\\." ).replace( /(.*)/, "^$1$" ) ); - return files.filter(function( build_filepath ) { - return filepathRe.test( build_filepath ); - }).length > 0; -} - -function pack( jqueryUi, components, theme, callback ) { - var builder = new Builder( jqueryUi, components ), - packer = new Packer( builder, theme ); - packer.pack(function( err, files ) { - if ( err ) { - callback( err, null ); - } else { - callback( null, files.map(function( build_item ) { - return build_item.path.split( "/" ).slice( 1 ).join( "/" ); - })); - } - }); -} - -function flatten( flat, arr ) { - return flat.concat( arr ); -} - -function replace( variable, value ) { - return function( filepath ) { - if ( filepath instanceof RegExp ) { - filepath = filepath.toString().replace(/^\//, "").replace(/\/$/, ""); - return new RegExp( filepath.replace( "\\{" + variable + "\\}", value ) ); - } - return filepath.replace( "{" + variable + "}", value ); - }; -} - -function stripBanner( src ) { - if ( src instanceof Buffer ) { - src = src.toString( "utf-8" ); - } - return src.replace( /^\s*\/\*[\s\S]*?\*\/\s*/g, "" ); -} - -var commonFiles = [ - "index.html", - "development-bundle/AUTHORS.txt", - "development-bundle/Gruntfile.js", - "development-bundle/MIT-LICENSE.txt", - "development-bundle/package.json", - "development-bundle/README.md", - /development-bundle\/jquery.js/, - "development-bundle/package.json", - "development-bundle/demos/demos.css", - "development-bundle/demos/images/demo-spindown-open.gif", - "development-bundle/demos/images/pbar-ani.gif", - "development-bundle/demos/images/demo-config-on-tile.gif", - "development-bundle/demos/images/icon-docs-info.gif", - "development-bundle/demos/images/demo-spindown-closed.gif", - "development-bundle/demos/images/demo-config-on.gif", - "development-bundle/demos/images/calendar.gif", - "development-bundle/external/globalize.culture.de-DE.js", - "development-bundle/external/globalize.culture.ja-JP.js", - "development-bundle/external/globalize.js", - "development-bundle/external/jquery.mousewheel.js", - "development-bundle/external/jshint.js", - "development-bundle/external/qunit.css", - "development-bundle/themes/base/all.css", - "development-bundle/themes/base/base.css", - "development-bundle/themes/base/theme.css", - "development-bundle/themes/base/jquery-ui.css", - "development-bundle/themes/base/images/animated-overlay.gif", - "development-bundle/themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png", - "development-bundle/themes/base/images/ui-bg_flat_75_ffffff_40x100.png", - "development-bundle/themes/base/images/ui-bg_glass_55_fbf9ee_1x400.png", - "development-bundle/themes/base/images/ui-bg_glass_65_ffffff_1x400.png", - "development-bundle/themes/base/images/ui-bg_glass_75_dadada_1x400.png", - "development-bundle/themes/base/images/ui-bg_glass_75_e6e6e6_1x400.png", - "development-bundle/themes/base/images/ui-bg_glass_95_fef1ec_1x400.png", - "development-bundle/themes/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png", - "development-bundle/themes/base/images/ui-icons_2e83ff_256x240.png", - "development-bundle/themes/base/images/ui-icons_222222_256x240.png", - "development-bundle/themes/base/images/ui-icons_454545_256x240.png", - "development-bundle/themes/base/images/ui-icons_888888_256x240.png", - "development-bundle/themes/base/images/ui-icons_cd0a0a_256x240.png", - "development-bundle/themes/base/minified/theme.min.css", - "development-bundle/themes/base/minified/jquery-ui.min.css", - "development-bundle/themes/base/minified/images/animated-overlay.gif", - "development-bundle/themes/base/minified/images/ui-bg_flat_0_aaaaaa_40x100.png", - "development-bundle/themes/base/minified/images/ui-bg_flat_75_ffffff_40x100.png", - "development-bundle/themes/base/minified/images/ui-bg_glass_55_fbf9ee_1x400.png", - "development-bundle/themes/base/minified/images/ui-bg_glass_65_ffffff_1x400.png", - "development-bundle/themes/base/minified/images/ui-bg_glass_75_dadada_1x400.png", - "development-bundle/themes/base/minified/images/ui-bg_glass_75_e6e6e6_1x400.png", - "development-bundle/themes/base/minified/images/ui-bg_glass_95_fef1ec_1x400.png", - "development-bundle/themes/base/minified/images/ui-bg_highlight-soft_75_cccccc_1x100.png", - "development-bundle/themes/base/minified/images/ui-icons_2e83ff_256x240.png", - "development-bundle/themes/base/minified/images/ui-icons_222222_256x240.png", - "development-bundle/themes/base/minified/images/ui-icons_454545_256x240.png", - "development-bundle/themes/base/minified/images/ui-icons_888888_256x240.png", - "development-bundle/themes/base/minified/images/ui-icons_cd0a0a_256x240.png", - "development-bundle/ui/jquery-ui.custom.js", - "development-bundle/ui/minified/jquery-ui.custom.min.js", - /js\/jquery.js/, - /js\/jquery-ui-[^\.]*\.[^\.]*\.[^\.]*\.custom\.js/, - /js\/jquery-ui-[^\.]*\.[^\.]*\.[^\.]*\.custom\.min\.js/ -]; -var skipFiles = [ - "development-bundle/MANIFEST", - "development-bundle/demos/addClass/*", - "development-bundle/demos/animate/*", - "development-bundle/demos/hide/*", - "development-bundle/demos/removeClass/*", - "development-bundle/demos/show/*", - "development-bundle/demos/switchClass/*", - "development-bundle/demos/toggle/*", - "development-bundle/demos/toggleClass/*" -]; -var COMMON_FILES_TESTCASES = commonFiles.length + skipFiles.length; -function commonFilesCheck( test, files ) { - commonFiles.forEach(function( filepath ) { - test.ok( filePresent( files, filepath ), "Missing a common file \"" + filepath + "\"." ); - }); - skipFiles.forEach(function( filepath ) { - test.ok( !filePresent( files, filepath ), "Should not include \"" + filepath + "\"." ); - }); -} - - -var componentFiles = { - "all": [ - "development-bundle/ui.{component}.jquery.json", - "development-bundle/ui/{component}.js", - "development-bundle/ui/minified/{component}.min.js" - ], - "widget": [ - "development-bundle/demos/widget/*", - "development-bundle/docs/jQuery.widget.html" - ], - "core": [ - "development-bundle/docs/data-selector.html", - "development-bundle/docs/disableSelection.html", - "development-bundle/docs/enableSelection.html", - "development-bundle/docs/focus.html", - "development-bundle/docs/focusable-selector.html", - "development-bundle/docs/jQuery.ui.keyCode.html", - "development-bundle/docs/removeUniqueId.html", - "development-bundle/docs/scrollParent.html", - "development-bundle/docs/tabbable-selector.html", - "development-bundle/docs/uniqueId.html", - "development-bundle/docs/zIndex.html" - ], - "mouse": [], - "position": [ - "development-bundle/demos/position/*", - "development-bundle/docs/position.html" - ], - "draggable": [ - "development-bundle/demos/draggable/*", - "development-bundle/docs/draggable.html" - ], - "droppable": [ - "development-bundle/demos/droppable/*", - "development-bundle/docs/droppable.html" - ], - "resizable": [ - "development-bundle/demos/resizable/*", - "development-bundle/docs/resizable.html", - "development-bundle/themes/base/resizable.css", - "development-bundle/themes/base/minified/resizable.min.css" - ], - "selectable": [ - "development-bundle/demos/selectable/*", - "development-bundle/docs/selectable.html", - "development-bundle/themes/base/selectable.css", - "development-bundle/themes/base/minified/selectable.min.css" - ], - "sortable": [ - "development-bundle/demos/sortable/*", - "development-bundle/docs/sortable.html" - ], - "accordion": [ - "development-bundle/demos/accordion/*", - "development-bundle/docs/accordion.html", - "development-bundle/themes/base/accordion.css", - "development-bundle/themes/base/minified/accordion.min.css" - ], - "autocomplete": [ - "development-bundle/demos/autocomplete/*", - "development-bundle/docs/autocomplete.html", - "development-bundle/themes/base/autocomplete.css", - "development-bundle/themes/base/minified/autocomplete.min.css" - ], - "button": [ - "development-bundle/demos/button/*", - "development-bundle/docs/button.html", - "development-bundle/themes/base/button.css", - "development-bundle/themes/base/minified/button.min.css" - ], - "datepicker": [ - "development-bundle/demos/datepicker/*", - "development-bundle/docs/datepicker.html", - "development-bundle/themes/base/datepicker.css", - "development-bundle/themes/base/minified/datepicker.min.css", - "development-bundle/ui/i18n/*", - "development-bundle/ui/i18n/datepicker-*.js", - "development-bundle/ui/i18n/jquery-ui-i18n.js" - ], - "dialog": [ - "development-bundle/demos/dialog/*", - "development-bundle/docs/dialog.html", - "development-bundle/themes/base/dialog.css", - "development-bundle/themes/base/minified/dialog.min.css" - ], - "menu": [ - "development-bundle/demos/menu/*", - "development-bundle/docs/menu.html", - "development-bundle/themes/base/menu.css", - "development-bundle/themes/base/minified/menu.min.css" - ], - "progressbar": [ - "development-bundle/demos/progressbar/*", - "development-bundle/docs/progressbar.html", - "development-bundle/themes/base/progressbar.css", - "development-bundle/themes/base/minified/progressbar.min.css" - ], - "slider": [ - "development-bundle/demos/slider/*", - "development-bundle/docs/slider.html", - "development-bundle/themes/base/slider.css", - "development-bundle/themes/base/minified/slider.min.css" - ], - "spinner": [ - "development-bundle/demos/spinner/*", - "development-bundle/docs/spinner.html", - "development-bundle/themes/base/spinner.css", - "development-bundle/themes/base/minified/spinner.min.css" - ], - "tabs": [ - "development-bundle/demos/tabs/*", - "development-bundle/docs/tabs.html", - "development-bundle/themes/base/tabs.css", - "development-bundle/themes/base/minified/tabs.min.css" - ], - "tooltip": [ - "development-bundle/demos/tooltip/*", - "development-bundle/docs/tooltip.html", - "development-bundle/themes/base/tooltip.css", - "development-bundle/themes/base/minified/tooltip.min.css" - ], - "effect": [ - "development-bundle/demos/effect/*", - "development-bundle/docs/addClass.html", - "development-bundle/docs/color-animation.html", - "development-bundle/docs/effect.html", - "development-bundle/docs/hide.html", - "development-bundle/docs/removeClass.html", - "development-bundle/docs/show.html", - "development-bundle/docs/switchClass.html", - "development-bundle/docs/toggle.html", - "development-bundle/docs/toggleClass.html" - ], - "effect-blind": [ - "development-bundle/docs/blind-effect.html" - ], - "effect-bounce": [ - "development-bundle/docs/bounce-effect.html" - ], - "effect-clip": [ - "development-bundle/docs/clip-effect.html" - ], - "effect-drop": [ - "development-bundle/docs/drop-effect.html" - ], - "effect-explode": [ - "development-bundle/docs/explode-effect.html" - ], - "effect-fade": [ - "development-bundle/docs/fade-effect.html" - ], - "effect-fold": [ - "development-bundle/docs/fold-effect.html" - ], - "effect-highlight": [ - "development-bundle/docs/highlight-effect.html" - ], - "effect-puff": [ - "development-bundle/docs/puff-effect.html" - ], - "effect-pulsate": [ - "development-bundle/docs/pulsate-effect.html" - ], - "effect-scale": [ - "development-bundle/docs/scale-effect.html" - ], - "effect-size": [ - "development-bundle/docs/size-effect.html" - ], - "effect-shake": [ - "development-bundle/docs/shake-effect.html" - ], - "effect-slide": [ - "development-bundle/docs/slide-effect.html" - ], - "effect-transfer": [ - "development-bundle/docs/transfer-effect.html" - ] -}; -var COMPONENT_FILES_TESTCASES = Object.keys( componentFiles ).reduce(function( sum, component ) { - return sum + componentFiles.all.length + componentFiles[ component ].length; -}, 0 ); -function componentFilesCheck( test, files, components ) { - Object.keys( componentFiles ).forEach(function( component ) { - if ( components.indexOf( component ) >= 0 ) { - componentFiles.all.map( replace( "component", component ) ).concat( componentFiles[ component ] ).forEach(function( filepath ) { - test.ok( filePresent( files, filepath ), "Missing a \"" + component + "\" file \"" + filepath + "\"." ); - }); - } else { - componentFiles.all.map( replace( "component", component ) ).concat( componentFiles[ component ] ).forEach(function( filepath ) { - test.ok( !filePresent( files, filepath ), "Should not include a \"" + component + "\" file \"" + filepath + "\"." ); - }); - } - }); -} - - -var themeFiles = { - "all": [ - /css\/\{folder_name\}\/jquery-ui-[^\.]*\.[^\.]*\.[^\.]*\.custom\.css/, - /css\/\{folder_name\}\/jquery-ui-[^\.]*\.[^\.]*\.[^\.]*\.custom\.min\.css/, - "development-bundle/themes/{folder_name}/all.css", - "development-bundle/themes/{folder_name}/base.css", - "development-bundle/themes/{folder_name}/{component}.css", - "development-bundle/themes/{folder_name}/jquery-ui.css", - "development-bundle/themes/{folder_name}/minified/{component}.min.css", - "development-bundle/themes/{folder_name}/minified/jquery-ui.min.css" - ], - "anyTheme": [ - "css/{folder_name}/images/animated-overlay.gif", - "css/{folder_name}/images/ui-icons*png", - "css/{folder_name}/images/ui-bg*png", - "development-bundle/themes/{folder_name}/theme.css", - "development-bundle/themes/{folder_name}/images/animated-overlay.gif", - "development-bundle/themes/{folder_name}/images/ui-icons*png", - "development-bundle/themes/{folder_name}/images/ui-bg*png", - "development-bundle/themes/{folder_name}/minified/theme.min.css", - "development-bundle/themes/{folder_name}/minified/images/animated-overlay.gif", - "development-bundle/themes/{folder_name}/minified/images/ui-icons*png", - "development-bundle/themes/{folder_name}/minified/images/ui-bg*png" - ] -}; -var themeComponents = "accordion autocomplete button core datepicker dialog menu progressbar resizable selectable slider spinner tabs tooltip".split( " " ), - themeComponentsRe = new RegExp( themeComponents.join( "|" ) ); -function themeComponentOnly( component ) { - return themeComponentsRe.test( component ); -} -var THEME_FILES_TESTCASES = function( components ) { - return Object.keys( themeFiles ).reduce(function( sum, group ) { - return sum + themeFiles[ group ].reduce(function( sum, themeFile ) { - return sum + ( (/\{component\}/).test( themeFile.toString() ) ? components.filter( themeComponentOnly ).length : 1 ); - }, 0); - }, 0 ); -}; -function themeFilesCheck( test, files, components, theme ) { - var expandComponents = function( themeFile ) { - // For every themeFile that has a {component} variable, replicate themeFile for each component (expanding each component). - if ( (/\{component\}/).test( themeFile.toString() ) ) { - return components.filter( themeComponentOnly ).map(function( component ) { - return replace( "component", component )( themeFile ); - }); - } - return themeFile; - }; - themeFiles.all.map( replace( "folder_name", theme.folderName() ) ).map( expandComponents ).reduce( flatten, [] ).forEach(function( filepath ) { - test.ok( filePresent( files, filepath ), "Missing a theme file \"" + filepath + "\"." ); - }); - themeFiles.anyTheme.map( replace( "folder_name", theme.folderName() ) ).map( expandComponents ).reduce( flatten, [] ).forEach(function( filepath ) { - if ( theme.isNull ) { - test.ok( !filePresent( files, filepath ), "Should not include the theme file \"" + filepath + "\"." ); - } else { - test.ok( filePresent( files, filepath ), "Missing a theme file \"" + filepath + "\"." ); - } - }); -} - - -var tests = { - "test: select all components": { - "with a theme": function( test ) { - var components = this.allComponents, - theme = this.theme; - test.expect( COMMON_FILES_TESTCASES + COMPONENT_FILES_TESTCASES + THEME_FILES_TESTCASES( components ) ); - pack( this.jqueryUi, components, theme, function( err, files ) { - if ( err ) { - test.ok( false, err.message ); - test.done(); - } else { - commonFilesCheck( test, files ); - componentFilesCheck( test, files, components ); - themeFilesCheck( test, files, components, theme ); - test.done(); - } - }); - }, - "with a named theme": function( test ) { - var components = this.allComponents, - namedTheme = this.namedTheme; - test.expect( COMMON_FILES_TESTCASES + COMPONENT_FILES_TESTCASES + THEME_FILES_TESTCASES( components ) ); - pack( this.jqueryUi, components, namedTheme, function( err, files ) { - if ( err ) { - test.ok( false, err.message ); - test.done(); - } else { - commonFilesCheck( test, files ); - componentFilesCheck( test, files, components ); - themeFilesCheck( test, files, components, namedTheme ); - test.done(); - } - }); - }, - "no theme": function( test ) { - var components = this.allComponents, - noTheme = this.noTheme; - test.expect( COMMON_FILES_TESTCASES + COMPONENT_FILES_TESTCASES + THEME_FILES_TESTCASES( components ) ); - pack( this.jqueryUi, components, noTheme, function( err, files ) { - if ( err ) { - test.ok( false, err.message ); - test.done(); - } else { - commonFilesCheck( test, files ); - componentFilesCheck( test, files, components ); - themeFilesCheck( test, files, components, noTheme ); - test.done(); - } - }); - } - }, - "test: select all widgets": function( test ) { - var components = this.allWidgets; - test.expect( COMMON_FILES_TESTCASES + COMPONENT_FILES_TESTCASES ); - pack( this.jqueryUi, components, this.theme, function( err, files ) { - if ( err ) { - test.ok( false, err.message ); - test.done(); - } else { - commonFilesCheck( test, files ); - componentFilesCheck( test, files, components ); - test.done(); - } - }); - }, - "test: select all effects": function( test ) { - var components = this.allEffects; - test.expect( COMMON_FILES_TESTCASES + COMPONENT_FILES_TESTCASES ); - pack( this.jqueryUi, components, this.theme, function( err, files ) { - if ( err ) { - test.ok( false, err.message ); - test.done(); - } else { - commonFilesCheck( test, files ); - componentFilesCheck( test, files, components ); - test.done(); - } - }); - }, - "test: select some widgets (1)": { - "with a theme": function( test ) { - var components = someWidgets1, - theme = this.theme; - test.expect( COMMON_FILES_TESTCASES + COMPONENT_FILES_TESTCASES + THEME_FILES_TESTCASES( components ) ); - pack( this.jqueryUi, components, theme, function( err, files ) { - if ( err ) { - test.ok( false, err.message ); - test.done(); - } else { - commonFilesCheck( test, files ); - componentFilesCheck( test, files, components ); - themeFilesCheck( test, files, components, theme ); - test.done(); - } - }); - }, - "with a named theme": function( test ) { - var components = someWidgets1, - namedTheme = this.namedTheme; - test.expect( COMMON_FILES_TESTCASES + COMPONENT_FILES_TESTCASES + THEME_FILES_TESTCASES( components ) ); - pack( this.jqueryUi, components, namedTheme, function( err, files ) { - if ( err ) { - test.ok( false, err.message ); - test.done(); - } else { - commonFilesCheck( test, files ); - componentFilesCheck( test, files, components ); - themeFilesCheck( test, files, components, namedTheme ); - test.done(); - } - }); - }, - "no theme": - function( test ) { - var components = someWidgets1, - noTheme = this.noTheme; - test.expect( COMMON_FILES_TESTCASES + COMPONENT_FILES_TESTCASES + THEME_FILES_TESTCASES( components ) ); - pack( this.jqueryUi, components, noTheme, function( err, files ) { - if ( err ) { - test.ok( false, err.message ); - test.done(); - } else { - commonFilesCheck( test, files ); - componentFilesCheck( test, files, components ); - themeFilesCheck( test, files, components, noTheme ); - test.done(); - } - }); - } - }, - "test: select some widgets (2)": function( test ) { - var components = someWidgets2; - test.expect( COMMON_FILES_TESTCASES + COMPONENT_FILES_TESTCASES ); - pack( this.jqueryUi, components, this.theme, function( err, files ) { - if ( err ) { - test.ok( false, err.message ); - test.done(); - } else { - commonFilesCheck( test, files ); - componentFilesCheck( test, files, components ); - test.done(); - } - }); - }, - "test: select no components": function( test ) { - var components = noComponents; - test.expect( COMMON_FILES_TESTCASES + COMPONENT_FILES_TESTCASES ); - pack( this.jqueryUi, components, this.theme, function( err, files ) { - if ( err ) { - test.ok( false, err.message ); - test.done(); - } else { - commonFilesCheck( test, files ); - componentFilesCheck( test, files, components ); - test.done(); - } - }); - }, - "test: scope widget CSS": function( test ) { - var builder, packer, - components = [ "core", "widget", "tabs" ], - filesToCheck = [ - new RegExp( "development-bundle/themes/smoothness/tabs.css" ), - /css\/smoothness\/jquery-ui-.*\.custom\.min\.css/ - ], - scope = "#wrapper"; - test.expect( filesToCheck.length ); - builder = new Builder( this.jqueryUi, components, { scope: scope } ); - packer = new Packer( builder, this.theme, { scope: scope } ); - packer.pack(function( err, files ) { - if ( err ) { - test.ok( false, err.message ); - } else { - files.filter(function( file ) { - return filesToCheck.some(function( filepath ) { - return filepath.test( file.path ); - }); - }).forEach(function( file ) { - test.ok( (new RegExp( "^" + scope )).test( stripBanner( file.data ) ), "Builder should scope any other-than-theme CSS. But, failed to scope \"" + file.path + "\"." ); - }); - } - test.done(); - }); - }, - "test: unique files": function( test ) { - var components = this.allComponents, - theme = this.theme; - test.expect( 1 ); - pack( this.jqueryUi, components, theme, function( err, files ) { - var anyDuplicate, - duplicates = [], - marked = {}; - files.forEach(function( filepath ) { - if( marked[ filepath ] ) { - duplicates.push( filepath ); - anyDuplicate = true; - } - marked[ filepath ] = true; - }); - test.ok( !anyDuplicate, "Duplicate files found:\n" + duplicates.join( ",\n" ) ); - test.done(); - }); - } -}; - - -module.exports = {}; - -// Build tests for each jqueryUi release -JqueryUi.all().filter(function( jqueryUi ) { - // Filter supported releases only - // 1: FIXME s/1.11.0pre/1.11.0 - return semver.gte( jqueryUi.pkg.version, "1.11.0pre" /* 1 */ ); -}).forEach(function( jqueryUi ) { - function deepTestBuild( obj, tests ) { - Object.keys( tests ).forEach(function( i ) { - if ( typeof tests[ i ] === "object" ) { - obj[ i ] = {}; - deepTestBuild( obj[ i ], tests[ i ] ); - } else { - obj[ i ] = function( test ) { - tests[ i ].call({ - jqueryUi: jqueryUi, - theme: new ThemeRoller({ version: jqueryUi.pkg.version }), - namedTheme: new ThemeRoller({ - vars: { folderName: "mytheme" }, - version: jqueryUi.pkg.version - }), - noTheme: new ThemeRoller({ - vars: null, - version: jqueryUi.pkg.version - }), - allComponents: jqueryUi.components().map(function( component ) { - return component.name; - }), - allWidgets: jqueryUi.components().filter(function( component ) { - return component.category === "widget"; - }).map(function( component ) { - return [ component.name ].concat( component.dependencies ); - }).reduce(function( flat, arr ) { - return flat.concat( arr ); - }, [] ).sort().filter(function( element, i, arr ) { - // unique - return i === arr.indexOf( element ); - }), - allEffects: jqueryUi.components().filter(function( component ) { - return (/effect/).test( component.name ); - }).map(function( component ) { - return component.name; - }) - }, test ); - }; - } - }); - } - module.exports[ jqueryUi.pkg.version ] = {}; - deepTestBuild( module.exports[ jqueryUi.pkg.version ], tests ); -}); diff --git a/test/packer.legacy.1.10.js b/test/packer.legacy.1.10.js deleted file mode 100644 index a4afd2e0..00000000 --- a/test/packer.legacy.1.10.js +++ /dev/null @@ -1,628 +0,0 @@ -var Builder = require( "../lib/builder" ), - JqueryUi = require( "../lib/jquery-ui" ), - Packer = require( "../lib/packer" ), - semver = require( "semver" ), - ThemeRoller = require( "../lib/themeroller" ), - someWidgets1 = "widget core position autocomplete button menu progressbar spinner tabs".split( " " ), - someWidgets2 = "widget core mouse position draggable resizable button datepicker dialog slider tooltip".split( " " ), - noComponents = [], - invalidComponent = "invalid_widget"; - - -function filePresent( files, filepath ) { - var filepathRe = filepath instanceof RegExp ? filepath : new RegExp( filepath.replace( /\*/g, "[^\/]*" ).replace( /\./g, "\\." ).replace( /(.*)/, "^$1$" ) ); - return files.filter(function( build_filepath ) { - return filepathRe.test( build_filepath ); - }).length > 0; -} - -function pack( jqueryUi, components, theme, callback ) { - var builder = new Builder( jqueryUi, components ), - packer = new Packer( builder, theme ); - packer.pack(function( err, files ) { - if ( err ) { - callback( err, null ); - } else { - callback( null, files.map(function( build_item ) { - return build_item.path.split( "/" ).slice( 1 ).join( "/" ); - })); - } - }); -} - -function flatten( flat, arr ) { - return flat.concat( arr ); -} - -function replace( variable, value ) { - return function( filepath ) { - if ( filepath instanceof RegExp ) { - filepath = filepath.toString().replace(/^\//, "").replace(/\/$/, ""); - return new RegExp( filepath.replace( "\\{" + variable + "\\}", value ) ); - } - return filepath.replace( "{" + variable + "}", value ); - }; -} - -function stripBanner( src ) { - if ( src instanceof Buffer ) { - src = src.toString( "utf-8" ); - } - return src.replace( /^\s*\/\*[\s\S]*?\*\/\s*/g, "" ); -} - -var commonFiles = [ - "index.html", - "development-bundle/AUTHORS.txt", - "development-bundle/Gruntfile.js", - "development-bundle/MIT-LICENSE.txt", - "development-bundle/package.json", - "development-bundle/README.md", - /development-bundle\/jquery-[^\.]*\.[^\.]*\.[^\.]*\.js/, - "development-bundle/package.json", - "development-bundle/demos/demos.css", - "development-bundle/demos/images/demo-spindown-open.gif", - "development-bundle/demos/images/pbar-ani.gif", - "development-bundle/demos/images/demo-config-on-tile.gif", - "development-bundle/demos/images/icon-docs-info.gif", - "development-bundle/demos/images/demo-spindown-closed.gif", - "development-bundle/demos/images/demo-config-on.gif", - "development-bundle/demos/images/calendar.gif", - "development-bundle/external/globalize.culture.de-DE.js", - "development-bundle/external/globalize.culture.ja-JP.js", - "development-bundle/external/globalize.js", - "development-bundle/external/jquery.mousewheel.js", - "development-bundle/external/jshint.js", - "development-bundle/external/qunit.css", - "development-bundle/themes/base/jquery.ui.all.css", - "development-bundle/themes/base/jquery.ui.base.css", - "development-bundle/themes/base/jquery.ui.theme.css", - "development-bundle/themes/base/jquery-ui.css", - "development-bundle/themes/base/images/animated-overlay.gif", - "development-bundle/themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png", - "development-bundle/themes/base/images/ui-bg_flat_75_ffffff_40x100.png", - "development-bundle/themes/base/images/ui-bg_glass_55_fbf9ee_1x400.png", - "development-bundle/themes/base/images/ui-bg_glass_65_ffffff_1x400.png", - "development-bundle/themes/base/images/ui-bg_glass_75_dadada_1x400.png", - "development-bundle/themes/base/images/ui-bg_glass_75_e6e6e6_1x400.png", - "development-bundle/themes/base/images/ui-bg_glass_95_fef1ec_1x400.png", - "development-bundle/themes/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png", - "development-bundle/themes/base/images/ui-icons_2e83ff_256x240.png", - "development-bundle/themes/base/images/ui-icons_222222_256x240.png", - "development-bundle/themes/base/images/ui-icons_454545_256x240.png", - "development-bundle/themes/base/images/ui-icons_888888_256x240.png", - "development-bundle/themes/base/images/ui-icons_cd0a0a_256x240.png", - "development-bundle/themes/base/minified/jquery.ui.theme.min.css", - "development-bundle/themes/base/minified/jquery-ui.min.css", - "development-bundle/themes/base/minified/images/animated-overlay.gif", - "development-bundle/themes/base/minified/images/ui-bg_flat_0_aaaaaa_40x100.png", - "development-bundle/themes/base/minified/images/ui-bg_flat_75_ffffff_40x100.png", - "development-bundle/themes/base/minified/images/ui-bg_glass_55_fbf9ee_1x400.png", - "development-bundle/themes/base/minified/images/ui-bg_glass_65_ffffff_1x400.png", - "development-bundle/themes/base/minified/images/ui-bg_glass_75_dadada_1x400.png", - "development-bundle/themes/base/minified/images/ui-bg_glass_75_e6e6e6_1x400.png", - "development-bundle/themes/base/minified/images/ui-bg_glass_95_fef1ec_1x400.png", - "development-bundle/themes/base/minified/images/ui-bg_highlight-soft_75_cccccc_1x100.png", - "development-bundle/themes/base/minified/images/ui-icons_2e83ff_256x240.png", - "development-bundle/themes/base/minified/images/ui-icons_222222_256x240.png", - "development-bundle/themes/base/minified/images/ui-icons_454545_256x240.png", - "development-bundle/themes/base/minified/images/ui-icons_888888_256x240.png", - "development-bundle/themes/base/minified/images/ui-icons_cd0a0a_256x240.png", - "development-bundle/ui/jquery-ui.custom.js", - "development-bundle/ui/minified/jquery-ui.custom.min.js", - /js\/jquery-[^\.]*\.[^\.]*\.[^\.]*\.js/, - /js\/jquery-ui-[^\.]*\.[^\.]*\.[^\.]*\.custom\.js/, - /js\/jquery-ui-[^\.]*\.[^\.]*\.[^\.]*\.custom\.min\.js/ -]; -var skipFiles = [ - "development-bundle/MANIFEST" -]; -var COMMON_FILES_TESTCASES = commonFiles.length + skipFiles.length; -function commonFilesCheck( test, files ) { - commonFiles.forEach(function( filepath ) { - test.ok( filePresent( files, filepath ), "Missing a common file \"" + filepath + "\"." ); - }); - skipFiles.forEach(function( filepath ) { - test.ok( !filePresent( files, filepath ), "Should not include \"" + filepath + "\"." ); - }); -} - - -var componentFiles = { - "all": [ - "development-bundle/ui.{component}.jquery.json", - "development-bundle/ui/jquery.ui.{component}.js", - "development-bundle/ui/minified/jquery.ui.{component}.min.js" - ], - "widget": [ - "development-bundle/demos/widget/*", - "development-bundle/docs/jQuery.widget.html" - ], - "core": [], - "mouse": [], - "position": [ - "development-bundle/demos/position/*", - "development-bundle/docs/position.html" - ], - "draggable": [ - "development-bundle/demos/draggable/*", - "development-bundle/docs/draggable.html" - ], - "droppable": [ - "development-bundle/demos/droppable/*", - "development-bundle/docs/droppable.html" - ], - "resizable": [ - "development-bundle/demos/resizable/*", - "development-bundle/docs/resizable.html", - "development-bundle/themes/base/jquery.ui.resizable.css", - "development-bundle/themes/base/minified/jquery.ui.resizable.min.css" - ], - "selectable": [ - "development-bundle/demos/selectable/*", - "development-bundle/docs/selectable.html", - "development-bundle/themes/base/jquery.ui.selectable.css", - "development-bundle/themes/base/minified/jquery.ui.selectable.min.css" - ], - "sortable": [ - "development-bundle/demos/sortable/*", - "development-bundle/docs/sortable.html" - ], - "accordion": [ - "development-bundle/demos/accordion/*", - "development-bundle/docs/accordion.html", - "development-bundle/themes/base/jquery.ui.accordion.css", - "development-bundle/themes/base/minified/jquery.ui.accordion.min.css" - ], - "autocomplete": [ - "development-bundle/demos/autocomplete/*", - "development-bundle/docs/autocomplete.html", - "development-bundle/themes/base/jquery.ui.autocomplete.css", - "development-bundle/themes/base/minified/jquery.ui.autocomplete.min.css" - ], - "button": [ - "development-bundle/demos/button/*", - "development-bundle/docs/button.html", - "development-bundle/themes/base/jquery.ui.button.css", - "development-bundle/themes/base/minified/jquery.ui.button.min.css" - ], - "datepicker": [ - "development-bundle/demos/datepicker/*", - "development-bundle/docs/datepicker.html", - "development-bundle/themes/base/jquery.ui.datepicker.css", - "development-bundle/themes/base/minified/jquery.ui.datepicker.min.css", - "development-bundle/ui/i18n/*", - "development-bundle/ui/i18n/jquery.ui.datepicker-*.js", - "development-bundle/ui/i18n/jquery-ui-i18n.js" - ], - "dialog": [ - "development-bundle/demos/dialog/*", - "development-bundle/docs/dialog.html", - "development-bundle/themes/base/jquery.ui.dialog.css", - "development-bundle/themes/base/minified/jquery.ui.dialog.min.css" - ], - "menu": [ - "development-bundle/demos/menu/*", - "development-bundle/docs/menu.html", - "development-bundle/themes/base/jquery.ui.menu.css", - "development-bundle/themes/base/minified/jquery.ui.menu.min.css" - ], - "progressbar": [ - "development-bundle/demos/progressbar/*", - "development-bundle/docs/progressbar.html", - "development-bundle/themes/base/jquery.ui.progressbar.css", - "development-bundle/themes/base/minified/jquery.ui.progressbar.min.css" - ], - "slider": [ - "development-bundle/demos/slider/*", - "development-bundle/docs/slider.html", - "development-bundle/themes/base/jquery.ui.slider.css", - "development-bundle/themes/base/minified/jquery.ui.slider.min.css" - ], - "spinner": [ - "development-bundle/demos/spinner/*", - "development-bundle/docs/spinner.html", - "development-bundle/themes/base/jquery.ui.spinner.css", - "development-bundle/themes/base/minified/jquery.ui.spinner.min.css" - ], - "tabs": [ - "development-bundle/demos/tabs/*", - "development-bundle/docs/tabs.html", - "development-bundle/themes/base/jquery.ui.tabs.css", - "development-bundle/themes/base/minified/jquery.ui.tabs.min.css" - ], - "tooltip": [ - "development-bundle/demos/tooltip/*", - "development-bundle/docs/tooltip.html", - "development-bundle/themes/base/jquery.ui.tooltip.css", - "development-bundle/themes/base/minified/jquery.ui.tooltip.min.css" - ], - "effect": [ - "development-bundle/demos/effect/*", - "development-bundle/demos/addClass/*", - "development-bundle/demos/animate/*", - "development-bundle/demos/hide/*", - "development-bundle/demos/removeClass/*", - "development-bundle/demos/show/*", - "development-bundle/demos/switchClass/*", - "development-bundle/demos/toggle/*", - "development-bundle/demos/toggleClass/*" - ], - "effect-blind": [ - "development-bundle/docs/blind-effect.html" - ], - "effect-bounce": [ - "development-bundle/docs/bounce-effect.html" - ], - "effect-clip": [ - "development-bundle/docs/clip-effect.html" - ], - "effect-drop": [ - "development-bundle/docs/drop-effect.html" - ], - "effect-explode": [ - "development-bundle/docs/explode-effect.html" - ], - "effect-fade": [ - "development-bundle/docs/fade-effect.html" - ], - "effect-fold": [ - "development-bundle/docs/fold-effect.html" - ], - "effect-highlight": [ - "development-bundle/docs/highlight-effect.html" - ], - "effect-pulsate": [ - "development-bundle/docs/pulsate-effect.html" - ], - "effect-scale": [ - "development-bundle/docs/puff-effect.html", - "development-bundle/docs/scale-effect.html", - "development-bundle/docs/size-effect.html" - ], - "effect-shake": [ - "development-bundle/docs/shake-effect.html" - ], - "effect-slide": [ - "development-bundle/docs/slide-effect.html" - ], - "effect-transfer": [ - "development-bundle/docs/transfer-effect.html" - ] -}; -var COMPONENT_FILES_TESTCASES = Object.keys( componentFiles ).reduce(function( sum, component ) { - return sum + componentFiles.all.length + componentFiles[ component ].length; -}, 0 ); -function componentFilesCheck( test, files, components ) { - Object.keys( componentFiles ).forEach(function( component ) { - if ( components.indexOf( component ) >= 0 ) { - componentFiles.all.map( replace( "component", component ) ).concat( componentFiles[ component ] ).forEach(function( filepath ) { - test.ok( filePresent( files, filepath ), "Missing a \"" + component + "\" file \"" + filepath + "\"." ); - }); - } else { - componentFiles.all.map( replace( "component", component ) ).concat( componentFiles[ component ] ).forEach(function( filepath ) { - test.ok( !filePresent( files, filepath ), "Should not include a \"" + component + "\" file \"" + filepath + "\"." ); - }); - } - }); -} - - -var themeFiles = { - "all": [ - /css\/\{folder_name\}\/jquery-ui-[^\.]*\.[^\.]*\.[^\.]*\.custom\.css/, - /css\/\{folder_name\}\/jquery-ui-[^\.]*\.[^\.]*\.[^\.]*\.custom\.min\.css/, - "development-bundle/themes/{folder_name}/jquery.ui.all.css", - "development-bundle/themes/{folder_name}/jquery.ui.base.css", - "development-bundle/themes/{folder_name}/jquery.ui.{component}.css", - "development-bundle/themes/{folder_name}/jquery-ui.css", - "development-bundle/themes/{folder_name}/minified/jquery.ui.{component}.min.css", - "development-bundle/themes/{folder_name}/minified/jquery-ui.min.css" - ], - "anyTheme": [ - "css/{folder_name}/images/animated-overlay.gif", - "css/{folder_name}/images/ui-icons*png", - "css/{folder_name}/images/ui-bg*png", - "development-bundle/themes/{folder_name}/jquery.ui.theme.css", - "development-bundle/themes/{folder_name}/images/animated-overlay.gif", - "development-bundle/themes/{folder_name}/images/ui-icons*png", - "development-bundle/themes/{folder_name}/images/ui-bg*png", - "development-bundle/themes/{folder_name}/minified/jquery.ui.theme.min.css", - "development-bundle/themes/{folder_name}/minified/images/animated-overlay.gif", - "development-bundle/themes/{folder_name}/minified/images/ui-icons*png", - "development-bundle/themes/{folder_name}/minified/images/ui-bg*png" - ] -}; -var themeComponents = "accordion autocomplete button core datepicker dialog menu progressbar resizable selectable slider spinner tabs tooltip".split( " " ), - themeComponentsRe = new RegExp( themeComponents.join( "|" ) ); -function themeComponentOnly( component ) { - return themeComponentsRe.test( component ); -} -var THEME_FILES_TESTCASES = function( components ) { - return Object.keys( themeFiles ).reduce(function( sum, group ) { - return sum + themeFiles[ group ].reduce(function( sum, themeFile ) { - return sum + ( (/\{component\}/).test( themeFile.toString() ) ? components.filter( themeComponentOnly ).length : 1 ); - }, 0); - }, 0 ); -}; -function themeFilesCheck( test, files, components, theme ) { - var expandComponents = function( themeFile ) { - // For every themeFile that has a {component} variable, replicate themeFile for each component (expanding each component). - if ( (/\{component\}/).test( themeFile.toString() ) ) { - return components.filter( themeComponentOnly ).map(function( component ) { - return replace( "component", component )( themeFile ); - }); - } - return themeFile; - }; - themeFiles.all.map( replace( "folder_name", theme.folderName() ) ).map( expandComponents ).reduce( flatten, [] ).forEach(function( filepath ) { - test.ok( filePresent( files, filepath ), "Missing a theme file \"" + filepath + "\"." ); - }); - themeFiles.anyTheme.map( replace( "folder_name", theme.folderName() ) ).map( expandComponents ).reduce( flatten, [] ).forEach(function( filepath ) { - if ( theme.isNull ) { - test.ok( !filePresent( files, filepath ), "Should not include the theme file \"" + filepath + "\"." ); - } else { - test.ok( filePresent( files, filepath ), "Missing a theme file \"" + filepath + "\"." ); - } - }); -} - - -var tests = { - "test: select all components": { - "with a theme": function( test ) { - var components = this.allComponents, - theme = this.theme; - test.expect( COMMON_FILES_TESTCASES + COMPONENT_FILES_TESTCASES + THEME_FILES_TESTCASES( components ) ); - pack( this.jqueryUi, components, theme, function( err, files ) { - if ( err ) { - test.ok( false, err.message ); - test.done(); - } else { - commonFilesCheck( test, files ); - componentFilesCheck( test, files, components ); - themeFilesCheck( test, files, components, theme ); - test.done(); - } - }); - }, - "with a named theme": function( test ) { - var components = this.allComponents, - namedTheme = this.namedTheme; - test.expect( COMMON_FILES_TESTCASES + COMPONENT_FILES_TESTCASES + THEME_FILES_TESTCASES( components ) ); - pack( this.jqueryUi, components, namedTheme, function( err, files ) { - if ( err ) { - test.ok( false, err.message ); - test.done(); - } else { - commonFilesCheck( test, files ); - componentFilesCheck( test, files, components ); - themeFilesCheck( test, files, components, namedTheme ); - test.done(); - } - }); - }, - "no theme": function( test ) { - var components = this.allComponents, - noTheme = this.noTheme; - test.expect( COMMON_FILES_TESTCASES + COMPONENT_FILES_TESTCASES + THEME_FILES_TESTCASES( components ) ); - pack( this.jqueryUi, components, noTheme, function( err, files ) { - if ( err ) { - test.ok( false, err.message ); - test.done(); - } else { - commonFilesCheck( test, files ); - componentFilesCheck( test, files, components ); - themeFilesCheck( test, files, components, noTheme ); - test.done(); - } - }); - } - }, - "test: select all widgets": function( test ) { - var components = this.allWidgets; - test.expect( COMMON_FILES_TESTCASES + COMPONENT_FILES_TESTCASES ); - pack( this.jqueryUi, components, this.theme, function( err, files ) { - if ( err ) { - test.ok( false, err.message ); - test.done(); - } else { - commonFilesCheck( test, files ); - componentFilesCheck( test, files, components ); - test.done(); - } - }); - }, - "test: select all effects": function( test ) { - var components = this.allEffects; - test.expect( COMMON_FILES_TESTCASES + COMPONENT_FILES_TESTCASES ); - pack( this.jqueryUi, components, this.theme, function( err, files ) { - if ( err ) { - test.ok( false, err.message ); - test.done(); - } else { - commonFilesCheck( test, files ); - componentFilesCheck( test, files, components ); - test.done(); - } - }); - }, - "test: select some widgets (1)": { - "with a theme": function( test ) { - var components = someWidgets1, - theme = this.theme; - test.expect( COMMON_FILES_TESTCASES + COMPONENT_FILES_TESTCASES + THEME_FILES_TESTCASES( components ) ); - pack( this.jqueryUi, components, theme, function( err, files ) { - if ( err ) { - test.ok( false, err.message ); - test.done(); - } else { - commonFilesCheck( test, files ); - componentFilesCheck( test, files, components ); - themeFilesCheck( test, files, components, theme ); - test.done(); - } - }); - }, - "with a named theme": function( test ) { - var components = someWidgets1, - namedTheme = this.namedTheme; - test.expect( COMMON_FILES_TESTCASES + COMPONENT_FILES_TESTCASES + THEME_FILES_TESTCASES( components ) ); - pack( this.jqueryUi, components, namedTheme, function( err, files ) { - if ( err ) { - test.ok( false, err.message ); - test.done(); - } else { - commonFilesCheck( test, files ); - componentFilesCheck( test, files, components ); - themeFilesCheck( test, files, components, namedTheme ); - test.done(); - } - }); - }, - "no theme": - function( test ) { - var components = someWidgets1, - noTheme = this.noTheme; - test.expect( COMMON_FILES_TESTCASES + COMPONENT_FILES_TESTCASES + THEME_FILES_TESTCASES( components ) ); - pack( this.jqueryUi, components, noTheme, function( err, files ) { - if ( err ) { - test.ok( false, err.message ); - test.done(); - } else { - commonFilesCheck( test, files ); - componentFilesCheck( test, files, components ); - themeFilesCheck( test, files, components, noTheme ); - test.done(); - } - }); - } - }, - "test: select some widgets (2)": function( test ) { - var components = someWidgets2; - test.expect( COMMON_FILES_TESTCASES + COMPONENT_FILES_TESTCASES ); - pack( this.jqueryUi, components, this.theme, function( err, files ) { - if ( err ) { - test.ok( false, err.message ); - test.done(); - } else { - commonFilesCheck( test, files ); - componentFilesCheck( test, files, components ); - test.done(); - } - }); - }, - "test: select no components": function( test ) { - var components = noComponents; - test.expect( COMMON_FILES_TESTCASES + COMPONENT_FILES_TESTCASES ); - pack( this.jqueryUi, components, this.theme, function( err, files ) { - if ( err ) { - test.ok( false, err.message ); - test.done(); - } else { - commonFilesCheck( test, files ); - componentFilesCheck( test, files, components ); - test.done(); - } - }); - }, - "test: scope widget CSS": function( test ) { - var builder, packer, - components = [ "core", "widget", "tabs" ], - filesToCheck = [ - new RegExp( "development-bundle/themes/smoothness/jquery.ui.tabs.css" ), - /css\/smoothness\/jquery-ui-.*\.custom\.min\.css/ - ], - scope = "#wrapper"; - test.expect( filesToCheck.length ); - builder = new Builder( this.jqueryUi, components, { scope: scope } ); - packer = new Packer( builder, this.theme, { scope: scope } ); - packer.pack(function( err, files ) { - if ( err ) { - test.ok( false, err.message ); - } else { - files.filter(function( file ) { - return filesToCheck.some(function( filepath ) { - return filepath.test( file.path ); - }); - }).forEach(function( file ) { - test.ok( (new RegExp( "^" + scope )).test( stripBanner( file.data ) ), "Builder should scope any other-than-theme CSS. But, failed to scope \"" + file.path + "\"." ); - }); - } - test.done(); - }); - }, - "test: unique files": function( test ) { - var components = this.allComponents, - theme = this.theme; - test.expect( 1 ); - pack( this.jqueryUi, components, theme, function( err, files ) { - var anyDuplicate, - duplicates = [], - marked = {}; - files.forEach(function( filepath ) { - if( marked[ filepath ] ) { - duplicates.push( filepath ); - anyDuplicate = true; - } - marked[ filepath ] = true; - }); - test.ok( !anyDuplicate, "Duplicate files found:\n" + duplicates.join( ",\n" ) ); - test.done(); - }); - } -}; - - -module.exports = {}; - -// Build tests for each jqueryUi release -JqueryUi.all().filter(function( jqueryUi ) { - // Filter supported releases only - // 1: FIXME s/1.11.0pre/1.11.0 - return semver.lt( jqueryUi.pkg.version, "1.11.0pre" /* 1 */ ) && semver.gte( jqueryUi.pkg.version, "1.10.0" ); -}).forEach(function( jqueryUi ) { - function deepTestBuild( obj, tests ) { - Object.keys( tests ).forEach(function( i ) { - if ( typeof tests[ i ] === "object" ) { - obj[ i ] = {}; - deepTestBuild( obj[ i ], tests[ i ] ); - } else { - obj[ i ] = function( test ) { - tests[ i ].call({ - jqueryUi: jqueryUi, - theme: new ThemeRoller({ version: jqueryUi.pkg.version }), - namedTheme: new ThemeRoller({ - vars: { folderName: "mytheme" }, - version: jqueryUi.pkg.version - }), - noTheme: new ThemeRoller({ - vars: null, - version: jqueryUi.pkg.version - }), - allComponents: jqueryUi.components().map(function( component ) { - return component.name; - }), - allWidgets: jqueryUi.components().filter(function( component ) { - return component.category === "widget"; - }).map(function( component ) { - return [ component.name ].concat( component.dependencies ); - }).reduce(function( flat, arr ) { - return flat.concat( arr ); - }, [] ).sort().filter(function( element, i, arr ) { - // unique - return i === arr.indexOf( element ); - }), - allEffects: jqueryUi.components().filter(function( component ) { - return (/effect/).test( component.name ); - }).map(function( component ) { - return component.name; - }) - }, test ); - }; - } - }); - } - module.exports[ jqueryUi.pkg.version ] = {}; - deepTestBuild( module.exports[ jqueryUi.pkg.version ], tests ); -}); diff --git a/test/packer.legacy.1.9.js b/test/packer.legacy.1.9.js deleted file mode 100644 index cbf2f349..00000000 --- a/test/packer.legacy.1.9.js +++ /dev/null @@ -1,590 +0,0 @@ -var Builder = require( "../lib/builder" ), - JqueryUi = require( "../lib/jquery-ui" ), - Packer = require( "../lib/packer" ), - semver = require( "semver" ), - ThemeRoller = require( "../lib/themeroller" ), - someWidgets1 = "widget core position autocomplete button menu progressbar spinner tabs".split( " " ), - someWidgets2 = "widget core mouse position draggable resizable button datepicker dialog slider tooltip".split( " " ), - noComponents = [], - invalidComponent = "invalid_widget"; - - -function filePresent( files, filepath ) { - var filepathRe = filepath instanceof RegExp ? filepath : new RegExp( filepath.replace( /\*/g, "[^\/]*" ).replace( /\./g, "\\." ).replace( /(.*)/, "^$1$" ) ); - return files.filter(function( build_filepath ) { - return filepathRe.test( build_filepath ); - }).length > 0; -} - -function pack( jqueryUi, components, theme, callback ) { - var builder = new Builder( jqueryUi, components ), - packer = new Packer( builder, theme ); - packer.pack(function( err, files ) { - if ( err ) { - callback( err, null ); - } else { - callback( null, files.map(function( build_item ) { - return build_item.path.split( "/" ).slice( 1 ).join( "/" ); - })); - } - }); -} - -function replace( variable, value ) { - return function( filepath ) { - if ( filepath instanceof RegExp ) { - filepath = filepath.toString().replace(/^\//, "").replace(/\/$/, ""); - return new RegExp( filepath.replace( "\\{" + variable + "\\}", value ) ); - } - return filepath.replace( "{" + variable + "}", value ); - }; -} - -function flatten( flat, arr ) { - return flat.concat( arr ); -} - - -var commonFiles = [ - "index.html", - "development-bundle/AUTHORS.txt", - "development-bundle/grunt.js", - "development-bundle/MIT-LICENSE.txt", - "development-bundle/package.json", - "development-bundle/README.md", - /development-bundle\/jquery-[^\.]*\.[^\.]*\.[^\.]*\.js/, - "development-bundle/package.json", - "development-bundle/demos/demos.css", - "development-bundle/demos/images/demo-spindown-open.gif", - "development-bundle/demos/images/pbar-ani.gif", - "development-bundle/demos/images/demo-config-on-tile.gif", - "development-bundle/demos/images/icon-docs-info.gif", - "development-bundle/demos/images/demo-spindown-closed.gif", - "development-bundle/demos/images/demo-config-on.gif", - "development-bundle/demos/images/calendar.gif", - "development-bundle/external/globalize.culture.de-DE.js", - "development-bundle/external/globalize.culture.ja-JP.js", - "development-bundle/external/globalize.js", - "development-bundle/external/jquery.bgiframe-2.1.2.js", - "development-bundle/external/jquery.cookie.js", - "development-bundle/external/jquery.metadata.js", - "development-bundle/external/jquery.mousewheel.js", - "development-bundle/external/jshint.js", - "development-bundle/external/qunit.css", - "development-bundle/themes/base/jquery.ui.all.css", - "development-bundle/themes/base/jquery.ui.base.css", - "development-bundle/themes/base/jquery.ui.theme.css", - "development-bundle/themes/base/jquery-ui.css", - "development-bundle/themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png", - "development-bundle/themes/base/images/ui-bg_flat_75_ffffff_40x100.png", - "development-bundle/themes/base/images/ui-bg_glass_55_fbf9ee_1x400.png", - "development-bundle/themes/base/images/ui-bg_glass_65_ffffff_1x400.png", - "development-bundle/themes/base/images/ui-bg_glass_75_dadada_1x400.png", - "development-bundle/themes/base/images/ui-bg_glass_75_e6e6e6_1x400.png", - "development-bundle/themes/base/images/ui-bg_glass_95_fef1ec_1x400.png", - "development-bundle/themes/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png", - "development-bundle/themes/base/images/ui-icons_2e83ff_256x240.png", - "development-bundle/themes/base/images/ui-icons_222222_256x240.png", - "development-bundle/themes/base/images/ui-icons_454545_256x240.png", - "development-bundle/themes/base/images/ui-icons_888888_256x240.png", - "development-bundle/themes/base/images/ui-icons_cd0a0a_256x240.png", - "development-bundle/themes/base/minified/jquery.ui.theme.min.css", - "development-bundle/themes/base/minified/jquery-ui.min.css", - "development-bundle/themes/base/minified/images/ui-bg_flat_0_aaaaaa_40x100.png", - "development-bundle/themes/base/minified/images/ui-bg_flat_75_ffffff_40x100.png", - "development-bundle/themes/base/minified/images/ui-bg_glass_55_fbf9ee_1x400.png", - "development-bundle/themes/base/minified/images/ui-bg_glass_65_ffffff_1x400.png", - "development-bundle/themes/base/minified/images/ui-bg_glass_75_dadada_1x400.png", - "development-bundle/themes/base/minified/images/ui-bg_glass_75_e6e6e6_1x400.png", - "development-bundle/themes/base/minified/images/ui-bg_glass_95_fef1ec_1x400.png", - "development-bundle/themes/base/minified/images/ui-bg_highlight-soft_75_cccccc_1x100.png", - "development-bundle/themes/base/minified/images/ui-icons_2e83ff_256x240.png", - "development-bundle/themes/base/minified/images/ui-icons_222222_256x240.png", - "development-bundle/themes/base/minified/images/ui-icons_454545_256x240.png", - "development-bundle/themes/base/minified/images/ui-icons_888888_256x240.png", - "development-bundle/themes/base/minified/images/ui-icons_cd0a0a_256x240.png", - "development-bundle/ui/jquery-ui.custom.js", - "development-bundle/ui/minified/jquery-ui.custom.min.js", - /js\/jquery-[^\.]*\.[^\.]*\.[^\.]*\.js/, - /js\/jquery-ui-[^\.]*\.[^\.]*\.[^\.]*\.custom\.js/, - /js\/jquery-ui-[^\.]*\.[^\.]*\.[^\.]*\.custom\.min\.js/ -]; -var skipFiles = [ - "development-bundle/MANIFEST" -]; -var COMMON_FILES_TESTCASES = commonFiles.length + skipFiles.length; -function commonFilesCheck( test, files ) { - commonFiles.forEach(function( filepath ) { - test.ok( filePresent( files, filepath ), "Missing a common file \"" + filepath + "\"." ); - }); - skipFiles.forEach(function( filepath ) { - test.ok( !filePresent( files, filepath ), "Should not include \"" + filepath + "\"." ); - }); -} - - -var componentFiles = { - "all": [ - "development-bundle/ui.{component}.jquery.json", - "development-bundle/ui/jquery.ui.{component}.js", - "development-bundle/ui/minified/jquery.ui.{component}.min.js" - ], - "widget": [ - "development-bundle/demos/widget/*", - "development-bundle/docs/jQuery.widget.html" - ], - "core": [], - "mouse": [], - "position": [ - "development-bundle/demos/position/*", - "development-bundle/docs/position.html" - ], - "draggable": [ - "development-bundle/demos/draggable/*", - "development-bundle/docs/draggable.html" - ], - "droppable": [ - "development-bundle/demos/droppable/*", - "development-bundle/docs/droppable.html" - ], - "resizable": [ - "development-bundle/demos/resizable/*", - "development-bundle/docs/resizable.html", - "development-bundle/themes/base/jquery.ui.resizable.css", - "development-bundle/themes/base/minified/jquery.ui.resizable.min.css" - ], - "selectable": [ - "development-bundle/demos/selectable/*", - "development-bundle/docs/selectable.html", - "development-bundle/themes/base/jquery.ui.selectable.css", - "development-bundle/themes/base/minified/jquery.ui.selectable.min.css" - ], - "sortable": [ - "development-bundle/demos/sortable/*", - "development-bundle/docs/sortable.html" - ], - "accordion": [ - "development-bundle/demos/accordion/*", - "development-bundle/docs/accordion.html", - "development-bundle/themes/base/jquery.ui.accordion.css", - "development-bundle/themes/base/minified/jquery.ui.accordion.min.css" - ], - "autocomplete": [ - "development-bundle/demos/autocomplete/*", - "development-bundle/docs/autocomplete.html", - "development-bundle/themes/base/jquery.ui.autocomplete.css", - "development-bundle/themes/base/minified/jquery.ui.autocomplete.min.css" - ], - "button": [ - "development-bundle/demos/button/*", - "development-bundle/docs/button.html", - "development-bundle/themes/base/jquery.ui.button.css", - "development-bundle/themes/base/minified/jquery.ui.button.min.css" - ], - "datepicker": [ - "development-bundle/demos/datepicker/*", - "development-bundle/docs/datepicker.html", - "development-bundle/themes/base/jquery.ui.datepicker.css", - "development-bundle/themes/base/minified/jquery.ui.datepicker.min.css", - "development-bundle/ui/i18n/*", - "development-bundle/ui/i18n/jquery.ui.datepicker-*.js", - "development-bundle/ui/i18n/jquery-ui-i18n.js" - ], - "dialog": [ - "development-bundle/demos/dialog/*", - "development-bundle/docs/dialog.html", - "development-bundle/themes/base/jquery.ui.dialog.css", - "development-bundle/themes/base/minified/jquery.ui.dialog.min.css" - ], - "menu": [ - "development-bundle/demos/menu/*", - "development-bundle/docs/menu.html", - "development-bundle/themes/base/jquery.ui.menu.css", - "development-bundle/themes/base/minified/jquery.ui.menu.min.css" - ], - "progressbar": [ - "development-bundle/demos/progressbar/*", - "development-bundle/docs/progressbar.html", - "development-bundle/themes/base/jquery.ui.progressbar.css", - "development-bundle/themes/base/minified/jquery.ui.progressbar.min.css" - ], - "slider": [ - "development-bundle/demos/slider/*", - "development-bundle/docs/slider.html", - "development-bundle/themes/base/jquery.ui.slider.css", - "development-bundle/themes/base/minified/jquery.ui.slider.min.css" - ], - "spinner": [ - "development-bundle/demos/spinner/*", - "development-bundle/docs/spinner.html", - "development-bundle/themes/base/jquery.ui.spinner.css", - "development-bundle/themes/base/minified/jquery.ui.spinner.min.css" - ], - "tabs": [ - "development-bundle/demos/tabs/*", - "development-bundle/docs/tabs.html", - "development-bundle/themes/base/jquery.ui.tabs.css", - "development-bundle/themes/base/minified/jquery.ui.tabs.min.css" - ], - "tooltip": [ - "development-bundle/demos/tooltip/*", - "development-bundle/docs/tooltip.html", - "development-bundle/themes/base/jquery.ui.tooltip.css", - "development-bundle/themes/base/minified/jquery.ui.tooltip.min.css" - ], - "effect": [ - "development-bundle/demos/effect/*", - "development-bundle/demos/addClass/*", - "development-bundle/demos/animate/*", - "development-bundle/demos/hide/*", - "development-bundle/demos/removeClass/*", - "development-bundle/demos/show/*", - "development-bundle/demos/switchClass/*", - "development-bundle/demos/toggle/*", - "development-bundle/demos/toggleClass/*" - ], - "effect-blind": [ - "development-bundle/docs/blind-effect.html" - ], - "effect-bounce": [ - "development-bundle/docs/bounce-effect.html" - ], - "effect-clip": [ - "development-bundle/docs/clip-effect.html" - ], - "effect-drop": [ - "development-bundle/docs/drop-effect.html" - ], - "effect-explode": [ - "development-bundle/docs/explode-effect.html" - ], - "effect-fade": [ - "development-bundle/docs/fade-effect.html" - ], - "effect-fold": [ - "development-bundle/docs/fold-effect.html" - ], - "effect-highlight": [ - "development-bundle/docs/highlight-effect.html" - ], - "effect-pulsate": [ - "development-bundle/docs/pulsate-effect.html" - ], - "effect-scale": [ - "development-bundle/docs/puff-effect.html", - "development-bundle/docs/scale-effect.html", - "development-bundle/docs/size-effect.html" - ], - "effect-shake": [ - "development-bundle/docs/shake-effect.html" - ], - "effect-slide": [ - "development-bundle/docs/slide-effect.html" - ], - "effect-transfer": [ - "development-bundle/docs/transfer-effect.html" - ] -}; -var COMPONENT_FILES_TESTCASES = Object.keys( componentFiles ).reduce(function( sum, component ) { - return sum + componentFiles.all.length + componentFiles[ component ].length; -}, 0 ); -function componentFilesCheck( test, files, components ) { - Object.keys( componentFiles ).forEach(function( component ) { - if ( components.indexOf( component ) >= 0 ) { - componentFiles.all.map( replace( "component", component ) ).concat( componentFiles[ component ] ).forEach(function( filepath ) { - test.ok( filePresent( files, filepath ), "Missing a \"" + component + "\" file \"" + filepath + "\"." ); - }); - } else { - componentFiles.all.map( replace( "component", component ) ).concat( componentFiles[ component ] ).forEach(function( filepath ) { - test.ok( !filePresent( files, filepath ), "Should not include a \"" + component + "\" file \"" + filepath + "\"." ); - }); - } - }); -} - - -var themeFiles = { - "all": [ - /css\/\{folder_name\}\/jquery-ui-[^\.]*\.[^\.]*\.[^\.]*\.custom\.css/, - /css\/\{folder_name\}\/jquery-ui-[^\.]*\.[^\.]*\.[^\.]*\.custom\.min\.css/, - "development-bundle/themes/{folder_name}/jquery.ui.all.css", - "development-bundle/themes/{folder_name}/jquery.ui.base.css", - "development-bundle/themes/{folder_name}/jquery.ui.{component}.css", - "development-bundle/themes/{folder_name}/jquery-ui.css", - "development-bundle/themes/{folder_name}/minified/jquery.ui.{component}.min.css", - "development-bundle/themes/{folder_name}/minified/jquery-ui.min.css" - ], - "anyTheme": [ - "css/{folder_name}/images/*", - "development-bundle/themes/{folder_name}/jquery.ui.theme.css", - "development-bundle/themes/{folder_name}/images/*", - "development-bundle/themes/{folder_name}/minified/jquery.ui.theme.min.css", - "development-bundle/themes/{folder_name}/minified/images/*" - ] -}; -var themeComponents = "accordion autocomplete button core datepicker dialog menu progressbar resizable selectable slider spinner tabs tooltip".split( " " ), - themeComponentsRe = new RegExp( themeComponents.join( "|" ) ); -function themeComponentOnly( component ) { - return themeComponentsRe.test( component ); -} -var THEME_FILES_TESTCASES = function( components ) { - return Object.keys( themeFiles ).reduce(function( sum, group ) { - return sum + themeFiles[ group ].reduce(function( sum, themeFile ) { - return sum + ( (/\{component\}/).test( themeFile.toString() ) ? components.filter( themeComponentOnly ).length : 1 ); - }, 0); - }, 0 ); -}; -function themeFilesCheck( test, files, components, theme ) { - var expandComponents = function( themeFile ) { - // For every themeFile that has a {component} variable, replicate themeFile for each component (expanding each component). - if ( (/\{component\}/).test( themeFile.toString() ) ) { - return components.filter( themeComponentOnly ).map(function( component ) { - return replace( "component", component )( themeFile ); - }); - } - return themeFile; - }; - themeFiles.all.map( replace( "folder_name", theme.folderName() ) ).map( expandComponents ).reduce( flatten, [] ).forEach(function( filepath ) { - test.ok( filePresent( files, filepath ), "Missing a theme file \"" + filepath + "\"." ); - }); - themeFiles.anyTheme.map( replace( "folder_name", theme.folderName() ) ).map( expandComponents ).reduce( flatten, [] ).forEach(function( filepath ) { - if ( theme.isNull ) { - test.ok( !filePresent( files, filepath ), "Should not include the theme file \"" + filepath + "\"." ); - } else { - test.ok( filePresent( files, filepath ), "Missing a theme file \"" + filepath + "\"." ); - } - }); -} - - -var tests = { - "test: select all components": { - "with a theme": function( test ) { - var components = this.allComponents, - theme = this.theme; - test.expect( COMMON_FILES_TESTCASES + COMPONENT_FILES_TESTCASES + THEME_FILES_TESTCASES( components ) ); - pack( this.jqueryUi, components, theme, function( err, files ) { - if ( err ) { - test.ok( false, err.message ); - test.done(); - } else { - commonFilesCheck( test, files ); - componentFilesCheck( test, files, components ); - themeFilesCheck( test, files, components, theme ); - test.done(); - } - }); - }, - "with a named theme": function( test ) { - var components = this.allComponents, - namedTheme = this.namedTheme; - test.expect( COMMON_FILES_TESTCASES + COMPONENT_FILES_TESTCASES + THEME_FILES_TESTCASES( components ) ); - pack( this.jqueryUi, components, namedTheme, function( err, files ) { - if ( err ) { - test.ok( false, err.message ); - test.done(); - } else { - commonFilesCheck( test, files ); - componentFilesCheck( test, files, components ); - themeFilesCheck( test, files, components, namedTheme ); - test.done(); - } - }); - }, - "no theme": function( test ) { - var components = this.allComponents, - noTheme = this.noTheme; - test.expect( COMMON_FILES_TESTCASES + COMPONENT_FILES_TESTCASES + THEME_FILES_TESTCASES( components ) ); - pack( this.jqueryUi, components, noTheme, function( err, files ) { - if ( err ) { - test.ok( false, err.message ); - test.done(); - } else { - commonFilesCheck( test, files ); - componentFilesCheck( test, files, components ); - themeFilesCheck( test, files, components, noTheme ); - test.done(); - } - }); - } - }, - "test: select all widgets": function( test ) { - var components = this.allWidgets; - test.expect( COMMON_FILES_TESTCASES + COMPONENT_FILES_TESTCASES ); - pack( this.jqueryUi, components, this.theme, function( err, files ) { - if ( err ) { - test.ok( false, err.message ); - test.done(); - } else { - commonFilesCheck( test, files ); - componentFilesCheck( test, files, components ); - test.done(); - } - }); - }, - "test: select all effects": function( test ) { - var components = this.allEffects; - test.expect( COMMON_FILES_TESTCASES + COMPONENT_FILES_TESTCASES ); - pack( this.jqueryUi, components, this.theme, function( err, files ) { - if ( err ) { - test.ok( false, err.message ); - test.done(); - } else { - commonFilesCheck( test, files ); - componentFilesCheck( test, files, components ); - test.done(); - } - }); - }, - "test: select some widgets (1)": { - "with a theme": function( test ) { - var components = someWidgets1, - theme = this.theme; - test.expect( COMMON_FILES_TESTCASES + COMPONENT_FILES_TESTCASES + THEME_FILES_TESTCASES( components ) ); - pack( this.jqueryUi, components, theme, function( err, files ) { - if ( err ) { - test.ok( false, err.message ); - test.done(); - } else { - commonFilesCheck( test, files ); - componentFilesCheck( test, files, components ); - themeFilesCheck( test, files, components, theme ); - test.done(); - } - }); - }, - "with a named theme": function( test ) { - var components = someWidgets1, - namedTheme = this.namedTheme; - test.expect( COMMON_FILES_TESTCASES + COMPONENT_FILES_TESTCASES + THEME_FILES_TESTCASES( components ) ); - pack( this.jqueryUi, components, namedTheme, function( err, files ) { - if ( err ) { - test.ok( false, err.message ); - test.done(); - } else { - commonFilesCheck( test, files ); - componentFilesCheck( test, files, components ); - themeFilesCheck( test, files, components, namedTheme ); - test.done(); - } - }); - }, - "no theme": - function( test ) { - var components = someWidgets1, - noTheme = this.noTheme; - test.expect( COMMON_FILES_TESTCASES + COMPONENT_FILES_TESTCASES + THEME_FILES_TESTCASES( components ) ); - pack( this.jqueryUi, components, noTheme, function( err, files ) { - if ( err ) { - test.ok( false, err.message ); - test.done(); - } else { - commonFilesCheck( test, files ); - componentFilesCheck( test, files, components ); - themeFilesCheck( test, files, components, noTheme ); - test.done(); - } - }); - } - }, - "test: select some widgets (2)": function( test ) { - var components = someWidgets2; - test.expect( COMMON_FILES_TESTCASES + COMPONENT_FILES_TESTCASES ); - pack( this.jqueryUi, components, this.theme, function( err, files ) { - if ( err ) { - test.ok( false, err.message ); - test.done(); - } else { - commonFilesCheck( test, files ); - componentFilesCheck( test, files, components ); - test.done(); - } - }); - }, - "test: select no components": function( test ) { - var components = noComponents; - test.expect( COMMON_FILES_TESTCASES + COMPONENT_FILES_TESTCASES ); - pack( this.jqueryUi, components, this.theme, function( err, files ) { - if ( err ) { - test.ok( false, err.message ); - test.done(); - } else { - commonFilesCheck( test, files ); - componentFilesCheck( test, files, components ); - test.done(); - } - }); - }, - "test: unique files": function( test ) { - var components = this.allComponents, - theme = this.theme; - test.expect( 1 ); - pack( this.jqueryUi, components, theme, function( err, files ) { - var anyDuplicate, - duplicates = [], - marked = {}; - files.forEach(function( filepath ) { - if( marked[ filepath ] ) { - duplicates.push( filepath ); - anyDuplicate = true; - } - marked[ filepath ] = true; - }); - test.ok( !anyDuplicate, "Duplicate files found:\n" + duplicates.join( ",\n" ) ); - test.done(); - }); - } -}; - - -module.exports = {}; - -// Build tests for each jqueryUi release -JqueryUi.all().filter(function( jqueryUi ) { - // Filter supported releases only - return semver.lt( jqueryUi.pkg.version, "1.10.0" ); -}).forEach(function( jqueryUi ) { - function deepTestBuild( obj, tests ) { - Object.keys( tests ).forEach(function( i ) { - if ( typeof tests[ i ] === "object" ) { - obj[ i ] = {}; - deepTestBuild( obj[ i ], tests[ i ] ); - } else { - obj[ i ] = function( test ) { - tests[ i ].call({ - jqueryUi: jqueryUi, - theme: new ThemeRoller({ version: jqueryUi.pkg.version }), - namedTheme: new ThemeRoller({ - vars: { folderName: "mytheme" }, - version: jqueryUi.pkg.version - }), - noTheme: new ThemeRoller({ - vars: null, - version: jqueryUi.pkg.version - }), - allComponents: jqueryUi.components().map(function( component ) { - return component.name; - }), - allWidgets: jqueryUi.components().filter(function( component ) { - return component.category === "widget"; - }).map(function( component ) { - return [ component.name ].concat( component.dependencies ); - }).reduce(function( flat, arr ) { - return flat.concat( arr ); - }, [] ).sort().filter(function( element, i, arr ) { - // unique - return i === arr.indexOf( element ); - }), - allEffects: jqueryUi.components().filter(function( component ) { - return (/effect/).test( component.name ); - }).map(function( component ) { - return component.name; - }) - }, test ); - }; - } - }); - } - module.exports[ jqueryUi.pkg.version] = {}; - deepTestBuild( module.exports[ jqueryUi.pkg.version], tests ); -}); diff --git a/test/setup.js b/test/setup.js new file mode 100644 index 00000000..d1cb06f8 --- /dev/null +++ b/test/setup.js @@ -0,0 +1,7 @@ +"use strict"; + +// Max time for done() to fire in an async test. +QUnit.config.testTimeout = 15e3; // 15 seconds + +// Enforce an "expect" argument or expect() call in all test bodies. +QUnit.config.requireExpects = true; diff --git a/test/themeroller-image.js b/test/themeroller-image.js new file mode 100644 index 00000000..46b35447 --- /dev/null +++ b/test/themeroller-image.js @@ -0,0 +1,55 @@ +"use strict"; + +const fs = require( "node:fs/promises" ); +const path = require( "node:path" ); +const Image = require( "../lib/themeroller-image" ); +const { compareImages } = require( "./lib/compare-images" ); + +const fixturesPath = path.join( __dirname, "fixtures" ); +const tmpFolderPath = path.join( __dirname, "tmp" ); + +QUnit.module( "themeroller-image", { + beforeEach: async function() { + await fs.rm( tmpFolderPath, { + recursive: true, + force: true + } ); + await fs.mkdir( tmpFolderPath, { recursive: true } ); + }, + afterEach: async function() { + + // await fs.rm( tmpFolderPath, { + // recursive: true, + // force: true + // } ); + } +} ); + +QUnit.test( "generates correct icons", async function( assert ) { + const done = assert.async(); + assert.expect( 1 ); + + const fixturePath = path.join( fixturesPath, + "images/ui-icons_444444_256x240.png" ); + + const image = new Image( { + icon: { color: "#444444" } + } ); + + image.get( async function( err, filename, data ) { + if ( err ) { + assert.ok( false, `Error: ${ err && err.message || err }` ); + done(); + return; + } + + const iconsPath = path.join( tmpFolderPath, filename ); + await fs.writeFile( iconsPath, data ); + + const { passed, message } = await compareImages( iconsPath, fixturePath, 2 ); + assert.ok( passed, message ); + + done(); + } ); +} ); + diff --git a/test/themeroller-themegallery.js b/test/themeroller-themegallery.js new file mode 100644 index 00000000..db454225 --- /dev/null +++ b/test/themeroller-themegallery.js @@ -0,0 +1,35 @@ +"use strict"; + +QUnit.module( "themeroller-themegallery" ); + +const zParams = require( "../lib/zparams" ); +const { themeGalleryData } = require( "../lib/themeroller-themegallery" ); + +function omit( obj, keys ) { + let key; + const copy = Object.create( null ); + for ( key in obj ) { + if ( !keys.includes( key ) ) { + copy[ key ] = obj[ key ]; + } + } + return copy; +} + +QUnit.test( "cachedZThemeParams in themeGalleryData", function( assert ) { + assert.expect( themeGalleryData.length ); + + return Promise + .all( themeGalleryData.map( ( { vars, cachedZThemeParams } ) => + new Promise( function( resolve ) { + zParams.unzip( cachedZThemeParams, ( unzippedVars ) => { + assert.deepEqual( + unzippedVars, + omit( vars, [ "name" ] ), + `Decompressed values match for theme ${ vars.name }` + ); + resolve(); + } ); + } ) + ) ); +} ); diff --git a/test/themeroller.js b/test/themeroller.js index 398c7979..740fedff 100644 --- a/test/themeroller.js +++ b/test/themeroller.js @@ -1,38 +1,90 @@ -var fs = require( "fs" ), - ThemeRoller = require( "../lib/themeroller" ); - -module.exports = { - "test: folder name": { - "default \"custom-theme\"": function( test ) { - var customTheme = new ThemeRoller({ - vars: { ffDefault: "MyCustomFont" } - }); - test.ok( customTheme.folderName() === "custom-theme", "Default folder name \"" + customTheme.folderName() + "\" is different from \"custom-theme\"" ); - test.done(); - }, - - "default when theme is null \"no-theme\"": function( test ) { - var theme = new ThemeRoller({ - vars: null - }); - test.ok( theme.folderName() === "no-theme", "Default folder name \"" + theme.folderName() + "\" is different from \"no-theme\"" ); - test.done(); - }, - - "custom folder name based on theme's name": function( test ) { - var theme = new ThemeRoller({ - vars: { name: "My Name" } - }); - test.ok( theme.folderName() === "my-name", "Folder name \"my-name\" expected, but got \"" + theme.folderName() + "\"" ); - test.done(); - }, - - "custom folder name": function( test ) { - var theme = new ThemeRoller({ - vars: { folderName: "my-name" } - }); - test.ok( theme.folderName() === "my-name", "Folder name \"my-name\" expected, but got \"" + theme.folderName() + "\"" ); - test.done(); +"use strict"; + +const fs = require( "node:fs/promises" ); +const ThemeRoller = require( "../lib/themeroller" ); + +QUnit.module( "themeroller", function() { + + QUnit.test( "folder name: default \"custom-theme\"", function( assert ) { + assert.expect( 1 ); + const customTheme = new ThemeRoller( { + vars: { ffDefault: "MyCustomFont" } + } ); + assert.strictEqual( customTheme.folderName(), "custom-theme", "Default folder name" ); + } ); + + QUnit.test( "folder name: default when theme is null \"no-theme\"", function( assert ) { + assert.expect( 1 ); + const theme = new ThemeRoller( { + vars: null + } ); + assert.strictEqual( theme.folderName(), "no-theme", "Default folder name" ); + } ); + + QUnit.test( "folder name: custom folder name based on theme's name", function( assert ) { + assert.expect( 1 ); + const theme = new ThemeRoller( { + vars: { name: "My Name" } + } ); + assert.strictEqual( theme.folderName(), "my-name", "Default folder name" ); + } ); + + QUnit.test( "folder name: custom folder name", function( assert ) { + assert.expect( 1 ); + const theme = new ThemeRoller( { + vars: { folderName: "my-name" } + } ); + assert.strictEqual( theme.folderName(), "my-name", "Default folder name" ); + } ); + + ( function() { + function dropThemeUrl( cssSource ) { + return cssSource.replace( /\n\s*\* To view and modify this theme, visit https?:\/\/jqueryui\.com\/themeroller\/[^\n]+\n/, "\n" ); } - } -}; + + [ "1.12.1", "1.13.3", "1.14.1" ].forEach( ( jQueryUiVersion ) => { + let theme; + + QUnit.module( `with jQuery UI ${ jQueryUiVersion }`, function( hooks ) { + hooks.beforeEach( async function setUp() { + const varsString = await fs.readFile( `${ __dirname }/fixtures/vars/smoothness.json`, "utf-8" ); + const vars = JSON.parse( varsString ); + + theme = new ThemeRoller( { vars, version: jQueryUiVersion } ); + } ); + + QUnit.test( "should instantiate", function( assert ) { + assert.expect( 1 ); + assert.ok( theme instanceof ThemeRoller, "Instance of ThemeRoller" ); + } ); + + QUnit.test( "should generate the theme CSS", async function( assert ) { + assert.expect( 1 ); + + const smoothnessCssFixture = await fs.readFile( `${ __dirname }/fixtures/jquery-ui-${ jQueryUiVersion }/themes/smoothness.css`, "utf-8" ); + + assert.strictEqual( + dropThemeUrl( theme.css() ), + dropThemeUrl( smoothnessCssFixture ), + "Theme CSS generated properly" + ); + } ); + + QUnit.test( "should generate images", function( assert ) { + assert.expect( 2 ); + const done = assert.async(); + + theme.generateImages( function( error, images ) { + try { + assert.strictEqual( error, null, "No errors" ); + assert.strictEqual( images && typeof images, "object", "An object generated" ); + } finally { + done(); + } + } ); + } ); + } ); + } ); + + } )(); +} ); diff --git a/themeroller.js b/themeroller.js index 7d81f36e..eb48c907 100644 --- a/themeroller.js +++ b/themeroller.js @@ -1,43 +1,45 @@ -var _ = require( "underscore" ), - fs = require( "fs" ), +"use strict"; + +var fs = require( "node:fs" ), Handlebars = require( "handlebars" ), - Image = require( "./lib/themeroller.image" ), + Image = require( "./lib/themeroller-image" ), + JqueryUi = require( "./lib/jquery-ui" ), querystring = require( "querystring" ), - textures = require( "./lib/themeroller.textures" ), - themeGallery = require( "./lib/themeroller.themegallery" )(), + textures = require( "./lib/themeroller-textures" ), + themeGallery = require( "./lib/themeroller-themegallery" )(), ThemeRoller = require( "./lib/themeroller" ); function renderImage( filename, response, callback ) { - new Image( filename ).get(function( err, filename, data ) { + new Image( filename ).get( function( err, filename, data ) { if ( err ) { return callback( err ); } response.setHeader( "Content-Type", "image/png" ); response.end( data ); callback(); - }); + } ); } // Returns 'selected="selected"' if param == value Handlebars.registerHelper( "selected", function( param, value ) { return new Handlebars.SafeString( param === value ? "selected=\"selected\"" : "" ); -}); +} ); Handlebars.registerHelper( "themeParams", function( serializedVars ) { return serializedVars.length > 0 ? "?themeParams=" + querystring.escape( serializedVars ) : ""; -}); +} ); var appinterfaceTemplate = Handlebars.compile( fs.readFileSync( __dirname + "/template/themeroller/appinterface.html", "utf8" ) ), - compGroupATemplate = Handlebars.compile( fs.readFileSync( __dirname + "/template/themeroller/comp_group_a.html", "utf8" ) ), - compGroupBTemplate = Handlebars.compile( fs.readFileSync( __dirname + "/template/themeroller/comp_group_b.html", "utf8" ) ), + demoTemplate = Handlebars.compile( fs.readFileSync( __dirname + "/template/themeroller/demo.html", "utf8" ) ), helpTemplate = Handlebars.compile( fs.readFileSync( __dirname + "/template/themeroller/help.html", "utf8" ) ), indexTemplate = Handlebars.compile( fs.readFileSync( __dirname + "/template/themeroller/index.html", "utf8" ) ), - jsonpTemplate = Handlebars.compile( fs.readFileSync( __dirname + "/template/jsonp.js", "utf8" ) ), themegalleryTemplate = Handlebars.compile( fs.readFileSync( __dirname + "/template/themeroller/themegallery.html", "utf8" ) ), wrapTemplate = Handlebars.compile( fs.readFileSync( __dirname + "/template/themeroller/wrap.html", "utf8" ) ); var Frontend = function( args ) { - _.extend( this, args ); + Object.assign( this, args, { + jqueryUiForThemeroller: JqueryUi.find( args.resources.jqueryuiVersionForThemeroller ) + } ); }; Frontend.prototype = { @@ -45,43 +47,46 @@ Frontend.prototype = { if ( vars && "zThemeParams" in vars ) { delete vars.zThemeParams; } - var theme = new ThemeRoller({ - vars: vars - }); + var production = this.env.toLowerCase() === "production"; options = options || {}; if ( options.wrap ) { - options = _.defaults({ + options = { + ...options, wrap: false - }, options ); - return wrapTemplate({ + }; + return wrapTemplate( { body: this.index( vars, options ), resources: this.resources - }); + } ); } - return indexTemplate({ - appinterface: appinterfaceTemplate({ + return indexTemplate( { + appinterface: appinterfaceTemplate( { help: helpTemplate(), - themegallery: themegalleryTemplate({ + themegallery: themegalleryTemplate( { + production: production, themeGallery: themeGallery - }) - }), - baseVars: themeGallery[ 2 ].serializedVars, - compGroupA: compGroupATemplate(), - compGroupB: compGroupBTemplate(), + } ) + } ), + baseVars: themeGallery[ 0 ].serializedVars, + demo: demoTemplate( { + production: production + } ), host: this.host, - production: this.env.toLowerCase() === "production", + lzmaWorker: production ? "/resources/external/lzma_worker.min.js" : "/node_modules/lzma/src/lzma_worker.js", + production: production, resources: this.resources, textures: JSON.stringify( textures ) - }); + } ); }, css: function( vars ) { - var theme = new ThemeRoller({ - vars: _.extend({ + var theme = new ThemeRoller( { + jqueryUi: this.jqueryUiForThemeroller, + vars: Object.assign( { dynamicImage: true, dynamicImageHost: this.host }, vars ) - }); + } ); return theme.css(); }, @@ -90,7 +95,7 @@ Frontend.prototype = { if ( err ) { error( err, response ); } - }); + } ); }, texture: function( filename, response, error ) { @@ -98,7 +103,7 @@ Frontend.prototype = { if ( err ) { error( err, response ); } - }); + } ); } };