pax_global_header00006660000000000000000000000064146372341620014522gustar00rootroot0000000000000052 comment=ec9d2fc952a683aaa9f0c523fbba0786babdf629 svg.js-3.2.4/000077500000000000000000000000001463723416200127425ustar00rootroot00000000000000svg.js-3.2.4/.config/000077500000000000000000000000001463723416200142655ustar00rootroot00000000000000svg.js-3.2.4/.config/karma.conf.cjs000066400000000000000000000050261463723416200170100ustar00rootroot00000000000000// Karma configuration const karmaCommon = require('./karma.conf.common.cjs') let chromeBin = 'ChromeHeadless' if (process.platform === 'linux') { // We need to choose either Chrome or Chromium. // Canary is not available on linux. // If we do not find Chromium then we can deduce that // either Chrome is installed or there is no Chrome variant at all, // in which case karma-chrome-launcher will output an error. // If `which` finds nothing it will throw an error. const { execSync } = require('child_process') try { if (execSync('which chromium-browser')) chromeBin = 'ChromiumHeadless' } catch (e) {} } module.exports = function (config) { config.set( Object.assign(karmaCommon(config), { files: [ 'spec/RAFPlugin.js', { pattern: 'spec/fixtures/fixture.css', included: false, served: true }, { pattern: 'spec/fixtures/pixel.png', included: false, served: true }, { pattern: 'src/**/*.js', included: false, served: true, type: 'modules' }, { pattern: 'spec/helpers.js', included: false, served: true, type: 'module' }, { pattern: 'spec/setupBrowser.js', included: true, type: 'module' }, { pattern: 'spec/spec/*/**/*.js', included: true, type: 'module' } ], // preprocess matching files before serving them to the browser // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor preprocessors: { 'src/**/*.js': ['coverage'] }, // test results reporter to use // possible values: 'dots', 'progress' // available reporters: https://npmjs.org/browse/keyword/karma-reporter reporters: ['progress', 'coverage'], coverageReporter: { // Specify a reporter type. type: 'lcov', dir: 'coverage/', subdir: function (browser) { // normalization process to keep a consistent browser name accross different OS return browser.toLowerCase().split(/[ /-]/)[0] // output the results into: './coverage/firefox/' }, instrumenterOptions: { istanbul: { esModules: true } } }, // start these browsers // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher browsers: [chromeBin, 'FirefoxHeadless'] }) ) } svg.js-3.2.4/.config/karma.conf.common.cjs000066400000000000000000000032131463723416200202730ustar00rootroot00000000000000// Karma shared configuration const os = require('os') const cpuCount = os.cpus().length module.exports = function (config) { return { // base path that will be used to resolve all patterns (eg. files, exclude) basePath: '../', // frameworks to use // available frameworks: https://npmjs.org/browse/keyword/karma-adapter frameworks: ['jasmine'], // list of files / patterns to load in the browser files: [ '.config/pretest.js', 'spec/RAFPlugin.js', { pattern: 'spec/fixtures/fixture.css', included: false, served: true }, { pattern: 'spec/fixtures/fixture.svg', included: false, served: true }, { pattern: 'spec/fixtures/pixel.png', included: false, served: true }, 'dist/svg.js', 'spec/spec/*.js' ], proxies: { '/fixtures/': '/base/spec/fixtures/', '/spec/': '/base/spec/' }, // web server port port: 9876, // enable / disable colors in the output (reporters and logs) colors: true, // level of logging // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG logLevel: config.LOG_INFO, // enable / disable watching file and executing tests whenever any file changes autoWatch: false, // Continuous Integration mode // if true, Karma captures browsers, runs the tests and exits singleRun: true, // Concurrency level // how many browser should be started simultaneous concurrency: cpuCount || Infinity, // list of files to exclude exclude: [] } } svg.js-3.2.4/.config/karma.conf.saucelabs.cjs000066400000000000000000000104501463723416200207460ustar00rootroot00000000000000// Karma configuration // https://wiki.saucelabs.com/display/DOCS/Platform+Configurator // TODO: remove dotenv after local test // require('dotenv').config() const karmaCommon = require('./karma.conf.common.cjs') const SauceLabsLaunchers = { /** Real mobile devices are not available * Your account does not have access to Android devices. * Please contact sales@saucelabs.com to add this feature to your account. */ /* sl_android_chrome: { base: 'SauceLabs', appiumVersion: '1.5.3', deviceName: 'Samsung Galaxy S7 Device', deviceOrientation: 'portrait', browserName: 'Chrome', platformVersion: '6.0', platformName: 'Android' }, */ /* sl_android: { base: 'SauceLabs', browserName: 'Android', deviceName: 'Android Emulator', deviceOrientation: 'portrait' }, */ SL_firefox_latest: { base: 'SauceLabs', browserName: 'firefox', version: 'latest' }, SL_chrome_latest: { base: 'SauceLabs', browserName: 'chrome', version: 'latest' }, SL_InternetExplorer: { base: 'SauceLabs', browserName: 'internet explorer', version: '11.0' } /* sl_windows_edge: { base: 'SauceLabs', browserName: 'MicrosoftEdge', version: 'latest', platform: 'Windows 10' }, sl_macos_safari: { base: 'SauceLabs', browserName: 'safari', platform: 'macOS 10.13', version: '12.0', recordVideo: true, recordScreenshots: true, screenResolution: '1024x768' } */ /*, sl_macos_iphone: { base: 'SauceLabs', browserName: 'Safari', deviceName: 'iPhone SE Simulator', deviceOrientation: 'portrait', platformVersion: '10.2', platformName: 'iOS' } 'SL_Chrome': { base: 'SauceLabs', browserName: 'chrome', version: '48.0', platform: 'Linux' }, 'SL_Firefox': { base: 'SauceLabs', browserName: 'firefox', version: '50.0', platform: 'Windows 10' }, 'SL_Safari': { base: 'SauceLabs', browserName: 'safari', platform: 'OS X 10.11', version: '10.0' } */ } module.exports = function (config) { if (!process.env.SAUCE_USERNAME || !process.env.SAUCE_ACCESS_KEY) { console.error( 'SAUCE_USERNAME and SAUCE_ACCESS_KEY must be provided as environment variables.' ) console.warn('Aborting Sauce Labs test') process.exit(1) } const settings = Object.assign(karmaCommon(config), { // Concurrency level // how many browser should be started simultaneous // Saucelabs allow up to 5 concurrent sessions on the free open source tier. concurrency: 5, // this specifies which plugins karma should load // by default all karma plugins, starting with `karma-` will load // so if you are really puzzled why something isn't working, then comment // out plugins: [] - it's here to make karma load faster // get possible karma plugins by `ls node_modules | grep 'karma-*'` plugins: ['karma-jasmine', 'karma-sauce-launcher'], // logLevel: config.LOG_DEBUG, // test results reporter to use // possible values: 'dots', 'progress' // available reporters: https://npmjs.org/browse/keyword/karma-reporter reporters: ['dots', 'saucelabs'], customLaunchers: SauceLabsLaunchers, // start these browsers browsers: Object.keys(SauceLabsLaunchers), sauceLabs: { testName: 'SVG.js Unit Tests' // connectOptions: { // noSslBumpDomains: "all" // }, // connectOptions: { // port: 5757, // logfile: 'sauce_connect.log' // }, } // The number of disconnections tolerated. // browserDisconnectTolerance: 0, // well, sometimes it helps to just restart // // How long does Karma wait for a browser to reconnect (in ms). // browserDisconnectTimeout: 10 * 60 * 1000, // // How long will Karma wait for a message from a browser before disconnecting from it (in ms). ~ macOS 10.12 needs more than 7 minutes // browserNoActivityTimeout: 20 * 60 * 1000, // // Timeout for capturing a browser (in ms). On newer versions of iOS simulator (10.0+), the start up time could be between 3 - 6 minutes. // captureTimeout: 12 * 60 * 1000, // this is useful if saucelabs takes a long time to boot a vm // // Required to make Safari on Sauce Labs play nice. // // hostname: 'karmalocal.dev' }) console.log(settings) config.set(settings) } svg.js-3.2.4/.config/polyfillListIE.js000066400000000000000000000015321463723416200175300ustar00rootroot00000000000000/* global SVGElement */ /* eslint no-new-object: "off" */ import CustomEventPolyfill from '@target/custom-event-polyfill/src/index.js6' import children from '../src/polyfills/children.js' /* IE 11 has no innerHTML on SVGElement */ import '../src/polyfills/innerHTML.js' /* IE 11 has no correct CustomEvent implementation */ CustomEventPolyfill() /* IE 11 has no children on SVGElement */ try { if (!SVGElement.prototype.children) { Object.defineProperty(SVGElement.prototype, 'children', { get: function () { return children(this) } }) } } catch (e) {} /* IE 11 cannot handle getPrototypeOf(not_obj) */ try { delete Object.getPrototypeOf('test') } catch (e) { var old = Object.getPrototypeOf Object.getPrototypeOf = function (o) { if (typeof o !== 'object') o = new Object(o) return old.call(this, o) } } svg.js-3.2.4/.config/pretest.js000066400000000000000000000007621463723416200163160ustar00rootroot00000000000000/* global XMLHttpRequest */ 'use strict' function get(uri) { var xhr = new XMLHttpRequest() xhr.open('GET', uri, false) xhr.send() if (xhr.status !== 200) { console.error('SVG.js fixture could not be loaded. Tests will fail.') } return xhr.responseText } function main() { var style = document.createElement('style') document.head.appendChild(style) style.sheet.insertRule(get('/fixtures/fixture.css'), 0) document.body.innerHTML = get('/fixtures/fixture.svg') } main() svg.js-3.2.4/.config/rollup.config.js000066400000000000000000000055201463723416200174060ustar00rootroot00000000000000import pkg from '../package.json' with { type: 'json' } import babel from '@rollup/plugin-babel' import resolve from '@rollup/plugin-node-resolve' import commonjs from '@rollup/plugin-commonjs' import filesize from 'rollup-plugin-filesize' import terser from '@rollup/plugin-terser' const buildDate = Date() const headerLong = `/*! * ${pkg.name} - ${pkg.description} * @version ${pkg.version} * ${pkg.homepage} * * @copyright ${pkg.author} * @license ${pkg.license} * * BUILT: ${buildDate} */;` const headerShort = `/*! ${pkg.name} v${pkg.version} ${pkg.license}*/;` const getBabelConfig = (node = false) => { let targets = pkg.browserslist const plugins = [ [ '@babel/transform-runtime', { version: '^7.24.7', regenerator: false, useESModules: true } ], [ 'polyfill-corejs3', { method: 'usage-pure' } ] ] if (node) { targets = 'maintained node versions' } return babel({ include: 'src/**', babelHelpers: 'runtime', babelrc: false, targets: targets, presets: [ [ '@babel/preset-env', { modules: false, // useBuildins and plugin-transform-runtime are mutually exclusive // https://github.com/babel/babel/issues/10271#issuecomment-528379505 // use babel-polyfills when released useBuiltIns: false, bugfixes: true, loose: true } ] ], plugins }) } // When few of these get mangled nothing works anymore // We loose literally nothing by let these unmangled const classes = [ 'A', 'ClipPath', 'Defs', 'Element', 'G', 'Image', 'Marker', 'Path', 'Polygon', 'Rect', 'Stop', 'Svg', 'Text', 'Tspan', 'Circle', 'Container', 'Dom', 'Ellipse', 'Gradient', 'Line', 'Mask', 'Pattern', 'Polyline', 'Shape', 'Style', 'Symbol', 'TextPath', 'Use' ] const config = (node, min, esm = false) => ({ input: node || esm ? './src/main.js' : './src/svg.js', output: { file: esm ? './dist/svg.esm.js' : node ? './dist/svg.node.cjs' : min ? './dist/svg.min.js' : './dist/svg.js', format: esm ? 'esm' : node ? 'cjs' : 'iife', name: 'SVG', sourcemap: true, banner: headerLong, // remove Object.freeze freeze: false }, treeshake: { // property getter have no sideeffects propertyReadSideEffects: false }, plugins: [ resolve({ browser: !node }), commonjs(), getBabelConfig(node), filesize(), !min ? {} : terser({ mangle: { reserved: classes }, output: { preamble: headerShort } }) ] }) // [node, minified, esm] const modes = [[false], [false, true], [true], [false, false, true]] export default modes.map((m) => config(...m)) svg.js-3.2.4/.config/rollup.polyfills.js000066400000000000000000000007211463723416200201540ustar00rootroot00000000000000import resolve from '@rollup/plugin-node-resolve' import commonjs from '@rollup/plugin-commonjs' import filesize from 'rollup-plugin-filesize' // We dont need babel. All polyfills are compatible const config = (ie) => ({ input: './.config/polyfillListIE.js', output: { file: 'dist/polyfillsIE.js', format: 'iife' }, plugins: [ resolve({ browser: true }), commonjs(), //terser(), filesize() ] }) export default [true].map(config) svg.js-3.2.4/.config/rollup.tests.js000066400000000000000000000025401463723416200173020ustar00rootroot00000000000000import * as pkg from '../package.json' import babel from '@rollup/plugin-babel' import multiEntry from '@rollup/plugin-multi-entry' import resolve from '@rollup/plugin-node-resolve' import commonjs from '@rollup/plugin-commonjs' const getBabelConfig = (targets) => babel({ include: ['src/**', 'spec/**/*'], babelHelpers: 'runtime', babelrc: false, presets: [ [ '@babel/preset-env', { modules: false, targets: targets || pkg.browserslist, // useBuildins and plugin-transform-runtime are mutually exclusive // https://github.com/babel/babel/issues/10271#issuecomment-528379505 // use babel-polyfills when released useBuiltIns: false, // corejs: 3, bugfixes: true } ] ], plugins: [ [ '@babel/plugin-transform-runtime', { corejs: 3, helpers: true, useESModules: true, version: '^7.9.6', regenerator: false } ] ] }) export default { input: ['spec/setupBrowser.js', 'spec/spec/*/*.js'], output: { file: 'spec/es5TestBundle.js', name: 'SVGTests', format: 'iife' }, plugins: [ resolve({ browser: true }), commonjs(), getBabelConfig(), multiEntry() ], external: ['@babel/runtime', '@babel/runtime-corejs3'] } svg.js-3.2.4/.eslintrc.json000066400000000000000000000006411463723416200155370ustar00rootroot00000000000000{ "parserOptions": { "ecmaVersion": "latest", "sourceType": "module" }, "env": { "browser": true, "es6": true }, "extends": ["eslint:recommended", "prettier"], "rules": { "padded-blocks": "off", "no-unused-vars": [ "error", { "vars": "all", "args": "after-used", "ignoreRestSiblings": true, "varsIgnorePattern": "^_" } ] } } svg.js-3.2.4/.github/000077500000000000000000000000001463723416200143025ustar00rootroot00000000000000svg.js-3.2.4/.github/CONTRIBUTING.md000066400000000000000000000031331463723416200165330ustar00rootroot00000000000000# Contributing When contributing to this repository, please first discuss the change you wish to make on gitter, or with an issue to increase your chances of getting your pull request merged into the main code base. ## Pull Request Process When you want to make contributions to the project, the process is pretty simple: 1. Discuss in an issue or on gitter what you'd like to change 2. Fork the repository to make your own local copy 3. Make a branch in the format of -. So for example if I made an issue to change the default color, and it was issue 385 (random) on the repo, the branch would be called `385-change-default-color` 4. Make the changes to the src and perhaps make a playground by duplicating the playgrounds we already have. - When you're done making changes, run `npm run build` to build the code and run the linter 5. If applicable - please write new tests, we like to keep our code well tesvted 🎉. Run the tests by running `npm test` 6. Push the code and make a pull request on the main svg.js repo 7. Enjoy our endless love and gratitude ❤️ Seriously, we love pull requests! So go wild! ## Code of Conduct We only have a few simple rules, because we know you wouldn't want to read a whole code of conduct guide now would you? 🤡 - don't say anything you wouldn't want said to you - If you think you can help, then we'd love it if you did! 😃 - Respect everybody - NEVER be rude If the contributors feel like you're doing anything rude, we have the right to delete/report your posts. So please just treat everybody nicely, and we can all be great friends! svg.js-3.2.4/.github/FUNDING.yml000066400000000000000000000001011463723416200161070ustar00rootroot00000000000000# These are supported funding model platforms github: [fuzzyma] svg.js-3.2.4/.github/ISSUE_TEMPLATE/000077500000000000000000000000001463723416200164655ustar00rootroot00000000000000svg.js-3.2.4/.github/ISSUE_TEMPLATE/bug-report.md000066400000000000000000000012671463723416200211030ustar00rootroot00000000000000--- name: Bug Report about: 🐞 Report a bug that you found --- # Bug report > **For support questions, please use [stackoverflow](https://stackoverflow.com/questions/tagged/svg.js) with the tag svg.js or head to our chat over at [gitter](https://gitter.im/svgdotjs/svg.js)**. ## Fiddle Modify [this fiddle](https://jsfiddle.net/Fuzzy/s06mfv5u/) to demonstrate the problem clearly, just fork it and paste the resulting fiddle in your issue. Please make sure this is a **minimal example**, containing only the minimum necessary code to help us troubleshoot your problem. ## Explanation - What is the behaviour you expect? - What is happening instead? - What error message are you getting? svg.js-3.2.4/.github/ISSUE_TEMPLATE/feature-request.md000066400000000000000000000024761463723416200221410ustar00rootroot00000000000000--- name: Feature Request about: 🎂 Ask nicely for something you reaaaaaaaally want --- # Feature request > **For support questions, please use [stackoverflow](https://stackoverflow.com/questions/tagged/svg.js) with the tag svg.js or head to our chat over at [gitter](https://gitter.im/svgdotjs/svg.js)**. If you want to make a feature request, here are some guidelines to make a good one: - Add example code and usage for feature requests to see how a user would use it - Tell us the benefits (everything is allowed) - Make a simple use case like the one below. Obviously your feature request shouldn't be so silly. But make it clear to the maintainers what you want added and how you plan to use it 😃 ## **Example** Drawing [Smiley the Meme](http://i0.kym-cdn.com/entries/icons/original/000/000/107/smily.jpg) It would be cool if SVG.js could be used to easily draw smiley the meme, it would make my life so much easier when I want to have memes in my svg. ### Benefits - Drawing memes would be quick and easy - Memes are funny I think the syntax to achieve this should be: ```js let meme = draw.meme({ radius: 300, cx: 50, cy: 80, lookAt: [30, 50] }) ``` Then the user could easily change where the smiley is looking with: ```js meme.lookAt(50, 40) // OR meme.lookAt([30, 20]) // OR meme.lookAt(new SVG.Point(30, 20)) ``` svg.js-3.2.4/.github/ISSUE_TEMPLATE/other.md000066400000000000000000000005031463723416200201260ustar00rootroot00000000000000--- name: Other Issue about: 🍺 Something else... --- > **For support questions, please use [stackoverflow](https://stackoverflow.com/questions/tagged/svg.js) with the tag svg.js or head to our chat over at [gitter](https://gitter.im/svgdotjs/svg.js), if you have a bug report or feature request, use those templates**. svg.js-3.2.4/.gitignore000066400000000000000000000001771463723416200147370ustar00rootroot00000000000000.DS_Store .idea .importjs.js test/ node_modules/ .vscode/ coverage/ spec/es5TestBundle.js .env dist index.html index.js todo.mdsvg.js-3.2.4/.prettierignore000066400000000000000000000001661463723416200160100ustar00rootroot00000000000000.DS_Store .idea .importjs.js test/ node_modules/ .vscode/ coverage/ spec/es5TestBundle.js .env dist package-lock.json svg.js-3.2.4/.prettierrc.json000066400000000000000000000001271463723416200160760ustar00rootroot00000000000000{ "trailingComma": "none", "tabWidth": 2, "semi": false, "singleQuote": true } svg.js-3.2.4/.travis.yml000066400000000000000000000003471463723416200150570ustar00rootroot00000000000000language: node_js node_js: - 'stable' services: - xvfb addons: firefox: latest chrome: stable install: - npm install - npm run build script: - npm test - cat coverage/firefox/lcov.info | node_modules/.bin/coveralls svg.js-3.2.4/CHANGELOG.md000066400000000000000000001201241463723416200145530ustar00rootroot00000000000000# Change Log All notable changes to this project will be documented in this file. The document follows the conventions described in [“Keep a CHANGELOG”](http://keepachangelog.com). ==== ## [3.2.4] ### Fixed - fixed dmove for nested svgs (https://github.com/svgdotjs/svg.draggable.js/issues/127) ## [3.2.3] ### Fixed - fixed import map for father (#1317) ## [3.2.2] ### Fixed - fixed import map ## [3.2.1] ### Fixed - skip descriptive elements on rebuild and `toParent()` (#1304) - allow 0 as animation duration and delay (#1225) - allow nodes that are not imported yet (#1252) - only apply color conversion to attributes that can take a color (#1241) - support css vars (#1230) - fix import of leading, dont write data to dom if not neccessary - discontinue use of svgjs:data in favor of data-svg - allow + as delemiter in paths (#1165) - added `amove()` methods to runner (#1131) - fix `css()`, dont throw when screenCtm fails (#968) - several type fixes ### Added - add terminate method to timeline so memory can be freed (#1295) - add more events to sugar (#1217) ## [3.2.0] ### Fixed - improve performance of `point()` by not creating intermediate objects (#1251) - fixed references by using single quotes instead of double quotes which lead to errors (#1277) - fixed a few spelling errors in comments (#1277) - fix several typings (#1253, #1280, #1300) ### Added - added second parameter `assignNewId` to `clone()` to allow cloning with the same id (#1161) ## [3.1.2] ### Fixed - fixed several type issues (#1249, #1233, #1231, #1223, #1215) - fixed `css()` returning camelCased properties even though they were specified in kebap-case - fixed `ObjectBag` loosing information when calling `valueOf()` (Numbers lost its unit) - fixed `parents()` (#1235) - fixed `nodeOrNew()` to work in object tags as well (#1219) ## [3.1.1] ### Fixed - fixed typings for tcs 4.2.4 (#1204, #1206, #1203) ## [3.1.0] ### Fixed - fixed `zoom()` method of runner which was passed a wrong parameter - fixed positioning methods of `TSpan` to position them by its bounding box - fixed `flip()` method which flips correctly by center by default now and accepts correct arguments - fixed a case in `rbox()` where not always all values of the box were updated - fixed `getOrigin()` function used by `transform()` so that all origin popssibilities specified in the docs are working (#1085) - fixed positioning of text by its baseline when using `amove()` - fixed tons of typings in the svg.d.ts file and relaxed type requirements for `put()` and `parent()` - fixed adopter when adopting an svg/html string. It had still its wrapper as parentNode attached - fixed `put()` which correctly creates an svgjs object from the passed element now before returning - fixed `parent()` which correctly returns a Dom instance when parent is the document or document-fragment - fixed `add()` which correctly removes namespaces of non-root svg elements now when added to another svg element (#1086) - fixed `isRoot()` which correctly returns false, if the element is in a document-fragment - fixed `replace()` which works without a parent now, too - fixed `defs()` which correctly returns `null` when called on a detached node that is not a root node - fixed `reference()` which correctly returns `null` instead of throwing when specifying an attribute which holds a number - fixed `flatten()` which correctly flattens now but doesn't accept parameters anymore (makes no sense) - fixed `ungroup()` which now inserts the elements at the correct position in the correct order and has position as second argument now - fixed `position` for `transform()` to also allow a position of 0 - fixed `bbox()` of `PathArray` and `PointArray` which returns an instance of `Box` now - fixed bug in creation of PointArray which had still references to source arrays in it - fixed `PID` controller and makeSetterGetter function - fixed `Queue.push` which didnt let you push queue items - fixed `Timeline.reverse()` which did exactly the opposite of what you would expect when passing `true/false` - fixed cancelAnimationFrame-mock for tests - fixed animate when=after to be really "now" when no runner is on the timeline - fixed animate attr which is also retargetable now - fixed internals of ObjectBag which can hold other Morphable values now - fixed animate transform which didnt change its origin on retarget for declarative animations - fixed path parsing (#1145) - fixed `clone()` to return the correct instance (#1154) ### Added - added second Parameter to `SVG(el, isHTML)` which allows to explicitely create elements in the HTML namespace (#1058) - added `unlink()` and `linker()` to hyperlinked elements to remove or access the underling `` element - added `wrap()` method to `Dom` which lets you wrap an element by another one - added `orient()` method to `Marker` - added `options` parameter to `dispatch()` and `fire()` to allow for more special needs - added `newLine()` constructor to `Text` to create a tspan marked as new line (#1088) - added `Fragment` as a wrapper for document-fragment - added position argument for `toParent()` - added position argument for `toRoot()` - added attr syntax for `data()` method - added index and array parameter when passing a function to `List.each()` so that it mostly behaves like map - added possibility to pass a transform object to `PointArray.transform()` similar to Point - added `with-last` as `when` to `animate` and `schedule` to let an animation start with the start of the last one in the timeline - added lots of tests in es6 format - added geometry and positioning methods to `A` (#1110) ### Deleted - deleted undocumented `Matrix.compose()` method which did the same as `new Matrix()` or `Matrix.transform()` - deleted undocumented `Path.morph()` and `Path.at()` which was replaced with Morphables in v3 ## [3.0.16] - 2019-11-12 ### Fixed - fixed build of polyfills which was broken because of core-js update ## [3.0.15] - 2019-11-08 ### Fixed - allow object input of `when` and `delay` to `animate()` ### Added - added missing dmove function to runner ## [3.0.14] - 2019-10-31 ### Fixed - hide parser from screen readers (#1023) ### Added - added transpiled esm bundle for webpack und co and faster import ## [3.0.13] - 2019-06-12 ### Fixed - fixed a bug in Timeline.finish() (#964) - fixed registration of classes with custom bundler - fixed transform getter (e.g. `el.transform('scale')`) - fixed typings (#1004) ## [3.0.12] - 2019-02-19 ### Fixed - fixed package.json which points to correct file for webpack now (browser keyword) - fixed typescript types ### Added - added `ForeignObject` to the core ## [3.0.11] - 2019-01-22 ### Fixed - fixed move commands (x, y, move) of text so that it moves text always by the upper left edge. - fixed center commands (cx, cy, center) of text so that it moves text always by the center. ## [3.0.10] - 2019-01-14 ### Fixed - fixed `textPath()`, `path().text()` and `text().path()` - fixed `root()` method - fixed default values returned by `attr`. Can be missleading if present. ### Added - added `findOne()` for better performance ## [3.0.9] - 2019-01-14 ### Fixed - renamed `unit()` to `convert()` due to name collision ## [3.0.8] - 2019-01-13 ### Fixed - added back `to()` as `unit()` of `SVG.Number` which was removed accidentally ## [3.0.7] - 2019-01-13 ### Fixed - fixed a bug in `isNulledBox()` and `domContains()` - performance changes: - replace `getElementsByTagName` with `querySelector` - make Color check in `attr` more restrictive to prevent expensive `toString` ## [3.0.6] - 2019-01-12 ### Fixed - fixed group move and size commands - default font size is not set anymore because it mostly goes against what the user wants - fix bug in `font()` which set wrong values ### Added - `PointArray.transform()` (#945) ## [3.0.5] - 2018-12-12 ### Fixed - fixed `parser` which didnt have all required css rules and not focusable=false - group `x(), y(), width(), height(), dx(), dy()` now correctly change the bbox of the group by moving/resizing all children - fixed timeline which fired `finished` too early - fixed `Animator.frame()`. The passed callback gets the current time now (same as RAF) - allow `loop(true)` which is the same as `loop()` ## [3.0.4] - 2018-12-07 ### Fixed - fixed `zoom` which was added correctly and is animatable now - fixed `Runner` which merges transformations on the correct frame and in the correct way now - fixed condition on which transforms get deleted from an element when animating - fixed `Timeline` which executes Runner in the correct order now - fixed `Svg` which correctly deletes the defs reference on `clear()` ## [3.0.3] - 2018-12-05 ### Fixed - fixed `Runner` which correctly retains transformations when it is still on a timeline - fixed `plot()` method of Runner - fixed `timeline()` so that one can set the timeline of an element now - fixed `G` and added missing `width/height` ## [3.0.2] - 2018-12-03 ### Fixed - fixed `List` which still didn't have all method names it should have - fixed `Runner` which correctly handle retargeted controlled animations now - fixed `Runner` so that it is able to be persisted correctly - fixed `Color` which correctly handles empty strings now - fixed `attr` which correctly handles Objects of other kind now - fixed `Morphable` which correctly calculates the done flag now ## [3.0.1] - 2018-12-03 ### Fixed - fixed `insertBefore`, `insertAfter` and `flip` correctly returning `this` - fixed `List` which didn't have all method names it should have ## [3.0.0] - 2018-12-01 ### Added - added `text()` method to `SVG.Path` to create a textPath from this path (#705) - added `SVG.HTMLNode` which is the object wrapped around html nodes to put something in them - added `dispatch()` method on `SVG.Element` which returns the dispatched event for event cancelation (#550) - added `isRoot()` on `SVG.Doc` (#809) - added a linter during the npm build process - added `beziere()` and `steps()` to generate easing functions - added `insertAfter()` and `insertBefore` - added `SVG.Style` which can be created with `style()` or `fontface()` (#517) - added `EventTarget` which is a baseclass to get event abilities (#641) - added `Dom` which is a baseclass to get dom abilities - added `round()` which lets you round attribues from a node - added `ax(), ay(), amove()` to change texts x and y values directly (#787) - added possibility to pass attributes into a constructor like: `new SVG.Rect({width:100})` - added possibility to pass in additional attribues to element creators e.g. `canvas.rect({x:100})` or `canvas.rect(100, 100, {x:100})` (#796) - added `SVG.List` (#645) - added `words()` and `element()` to `Dom` because of (#935) - added lab, lch, hsl and cmyk color spaces (#790) - added `random()` method on `SVG.Color` to create random colors of different kinds (#939) ### Removed - removed `SVG.Array.split()` function - removed workaround for browser bug with stroke-width - removed polyfills - removed `SVG.Set` in favour of `SVG.List` - removed feature to set style with css string (e.g. "fill:none;display:block;") - removed `loaded()` and `error()` method on `SVG.Image` (#706) - removed sub-pixel offset fix - removed `SVG.Nested` (#809) - removed `show()` from `SVG.A` to avoid name clash (#802) - removed `size()` from `SVG.Text` to avoid name clash (#799) - removed `native()` function - removed `Bare` in favour of `Dom` (#935) - removed `bower` support because it is deprecated ### Changed - gradients now have there corresponding node as type and not only radial/linear - `SVG.Path.pointAt()` correctly returns an `SVG.Point` now - replaced static reference to `masker` in `SVG.Mask` with the `masker()` method - replaced static reference to `clipper` in `SVG.ClipPath` with the `clipper()` method - replaced static reference to `targets` in `SVG.Mask` and `SVG.ClipPath` with the `targets()` method - moved all regexes to `SVG.regex` - new constructor signature for `SVG.Image` and `load()`: `container.image(src, callback) / image.load(src, callback)` (#706) - changed `style()` to `css()`. Now accepts array as input and returns object when no argument given (#517) - ids are not generated upon creation anymore. Instead they are generated when requested (#559) - `SVG.extend()` now expects exactly one module or an array of modules - `SVG.Text.path()` now returns an instance of SVG.TextPath (#705) - `SVG.Text.path()` does not move all contents to the textPath (#705) - `SVG.TextPath` now inherits from `SVG.Text` and can be manipulated the same way (#705) - `SVG.Text.textPath()` returns the first textPaths in the text element (#705) - renamed `SVG.Stop` constructor `at()` on `SVG.Gradient` to `stop()` (#707) - renamed `fill()` method on `SVG.Gradient` and `SVG.Pattern` to `url()` (#708) - renamed `previous()` method to `prev()` - changed `childNodes` to `children` (same for `firstChild`, `lastChild`, ...) (#710) - changed it back because of performance drop - moved `defs()` method from `SVG.Parent` to `SVG.Element` - `SVG()` can be called with css selector, node or svg string, now. Without an argument it creates a new `SVG.Doc()` (#646) - `add()`, `put()`, `addTo()`, `putIn()` now excepts all arguments accepted by `SVG()` - all `SVG.*` objects now can have a node as parameter when constructing - `SVG()` does not set a default size anymore - default constructor now has an optional `node` argument which is used to consruct the object e.g. `new SVG.Rect(rectNode)` - SVG.Elements constructor now tries to import svgjs:data from the node - `SVG.on()` calls the listener in the context of the passed object. el.on always uses the svg.js object as context - `SVG.on()/off()` and `el.on()/off()` now accepts multiple comma or space separated events e.g. "mousedown, foo bar" (#727) - Matrices now apply transformations like `scale`, `translate`, etc... by left multiplying them to simplify transformations - The way `transform()` works is now completely different. See the docs for more as soon as they are updated - merged `SVG.Doc` and `SVG.Nested`, added `isRoot()` on `SVG.Doc()` (#809) - The fx module was completely reworked to be faster and less error prone. For more information on how to use it refer to the docs - The whole lib is now splitted into es6 modules (#875) - `Element.svg()` now can can replace the current node, can export the children of a node and can take an export modifier to change/replace the exported nodes - `ungroup()` now breaks off one container and not more - `clone()` does not add the clone to the dom anymore - `attr()` excepts array now to get multiple values at once - `SVG.Text.rebuild()` now takes every font-size into account (#512) - `fill()` and `stroke()` return the fill and stroke attribute when called as getter (#789) - `parents()` now gives back all parents until the passed one or document - `Image` callback passes normal `load` event instead of custom object (#931) - renamed `Doc` to `Svg` and `doc()` to `root` (and `toDoc()/toRoot()`) (#932) ## [2.7.1] - 2018-11-30 ### Fixed - CustomEvent-polyfill was not used (needed in IE) (#938) ## [2.7.0] - 2018-11-13 ### Fixed - fixed calling `parent()` on `documentFragment`s children (#927) - parser is not focusable anymore (#908) - `SVG.Element.click(null)` correctly unbinds the event (#878) - fix memory leak (#905) ### Added - `SVG.Set` now accepts another Set as input (#893) - `on()/off()` accepts multiple event names as input (backport from 3.0) ## [2.6.6] - 2018-08-30 ### Added - added global reference to support 'window' in bundlers (#767) ## [2.6.5] - 2018-05-26 ### Fixed - fixed `element.parent()` which sometimes failed when used on detached documents (#759) - fixed `SVG.Text.y()` which didnt work correctly with `SVG.Number` (#778) - fixed `SVG.Doc.clone()` which throwed an error (#782) - fixed `SVG.Mask.clone()` which throwed an error (#782) - fixed `SVG.PointArray` having a reference to outside array in some cases (#803) - fixed `reference()` which failed when trying to use a reference which does not exist in the attribuets (#840) - fixed `animate().attr()` method which doenst work for `d` attribute of paths (#847) - fixed problems with `CustomEvent` polyfill in IE11 (#852) ### Added - added possibility to pass an array of point objects to SVG.PointArray (#803) ## [2.6.4] - 2018-02-07 ### Fixed - fixed memory leak when creating images (#805) ## [2.6.3] - 2017-07-21 ### Fixed - fixed error in parent method when hitting document node (#720) ## [2.6.2] - 2017-06-05 ### Added - added `width()` and `height()` methods to `SVG.FX` - added the intended functionality to call animate functions with multiple parameter (#671) ### Changed - updated Jasmine from 2.5.2 to 2.6.0 - removed the typeof check in the initialisation of SVG.Matrix ### Fixed - fixed `SVG.FX.once` so that it add its callback on the last situation instead of the current one - fixed `SVG.FX.step` so that the animation doesn't stop if an afterAll callback call animate (#677) ## [2.6.1] - 2017-04-25 ### Fixed - fixed a bug in path parser which made it stop parsing when hitting z command (#665) ## [2.6.1] - 2017-04-25 ### Fixed - fixed a bug in path parser which made it stop parsing when hitting z command (#665) ## [2.6.0] - 2017-04-21 ### Added - added `options` object to `SVG.on()` and `el.on()` (#661) ### Changed - back to sloppy mode because of problems with plugins (#660) ## [2.5.3] - 2017-04-15 ### Added - added gitter badge in readme ### Fixed - fixed svg.js.d.ts (#644 #648) - fixed bug in `el.flip()` which causes an error when calling flip without any argument ### Removed - component.json (#652) ## [2.5.2] - 2017-04-11 ### Changed - SVG.js is now running in strict mode ### Fixed - `clear()` does not remove the parser in svg documents anymore - `len` not declared in FX module, making it a global variable (9737e8a) - `bbox` not declared in SVG.Box.transform in the Box module (131df0f) - `namespace` not declared in the Event module (e89c97e) ## [2.5.1] - 2017-03-27 ### Changed - make svgjs ready to be used on the server ### Fixed - fixed `SVG.PathArray.parse` that did not correctly parsed flat arrays - prevented unnecessary parsing of point or path strings ## [2.5.0] - 2017-03-10 ### Added - added a plot and array method to `SVG.TextPath` (#582) - added `clone()` method to `SVG.Array/PointArray/PathArray` (#590) - added `font()` method to `SVG.Tspan` - added `SVG.Box()` - added `transform()` method to boxes - added `event()` to `SVG.Element` to retrieve the event that was fired last on the element (#550) ### Changed - changed CHANGELOG to follow the conventions described in [“Keep a CHANGELOG”](http://keepachangelog.com) (#578) - make the method plot a getter when no parameter is passed for `SVG.Polyline`,`SVG.Polygon`, `SVG.Line`, `SVG.Path` (related #547) - allow `SVG.PointArray` to be passed flat array - change the regexp `SVG.PointArray` use to parse string to allow more flexibility in the way spaces and commas can be used - allow `plot` to be called with 4 parameters when animating an `SVG.Line` - relative value for `SVG.Number` are now calculated in its `morph` method (related #547) - clean up the implementation of the `initAnimation` method of the FX module (#547, #552, #584) - deprecated `.tbox()`. `.tbox()` now map to `.rbox()`. If you are using `.tbox()`, you can substitute it with `.rbox()` (#594, #602) - all boxes now accept 4 values or an object on creation - `el.rbox()` now always returns the right boxes in screen coordinates and has an additional paramater to transform the box into other coordinate systems - `font()` method can now be used like `attr()` method (#620) - events are now cancelable by default (#550) ### Fixed - fixed a bug in the plain morphing part of `SVG.MorphObj` that is in the FX module - fixed bug which produces an error when removing an event from a node which was formerly removed with a global `off()` (#518) - fixed a bug in `size()` for poly elements when their height/width is zero (#505) - viewbox now also accepts strings and arrays as constructor arguments - `SVG.Array` now accepts a comma seperated string and returns array of numbers instead of strings - `SVG.Matrix` now accepts an array as input - `SVG.Element.matrix()` now accepts also 6 values - `dx()/dy()` now accepts percentage values, too but only if the value on the element is already percentage - `flip()` now flips on both axis when no parameter is passed - fixed bug with `documentElement.contains()` in IE - fixed offset produced by svg parser (#553) - fixed a bug with clone which didnt copy over dom data (#621) ## [2.4.0] - 2017-01-14 ### Added - added support for basic path animations (#561) ## [2.3.7] - 2017-01-14 ### Added - added code coverage https://coveralls.io/github/svgdotjs/svg.js (3e614d4) - added `npm run test:quick` which aim at being fast rather than correct - great for git hooks (981ce24) ### Changed - moved project to [svgdotjs](https://github.com/svgdotjs) - made matrixify work with transformation chain separated by commas (#543) - updated dev dependencies; request and gulp-chmod - `npm run build` now requires nodejs 4.x+ ### Fixed - fixed `SVG.Matrix.skew()` (#545) - fixed broken animations, if using polyfills for es6/7 proposals (#504) - fixed and improved `SVG.FX.dequeue()` (#546) - fixed an error in `SVG.FX.step`, if custom properties is added to `Array.prototype` (#549) ## [2.3.6] - 2016-10-21 ### Changed - make SVG.FX.loop modify the last situation instead of the current one (#532) ### Fixed - fixed leading and trailing space in SVG.PointArray would return NaN for some points (695f26a) (#529) - fixed test of `SVG.FX.afterAll` (#534) - fixed `SVG.FX.speed()` (#536) ## [2.3.5] - 2016-10-13 ### Added - added automated unit tests via [Travis](https://travis-ci.org/svgdotjs/svg.js) (#527) - added `npm run build` to build a new version of SVG.js without requiring gulp to be globally installed ### Changed - calling `fill()`, `stroke()` without an argument is now a nop - Polygon now accepts comma less points to achieve parity with Adobe Illustrator (#529) - updated dependencies ## [2.3.4] - 2016-08-04 ### Changed - reworked parent module for speed improvemenents - reworked `filterSVGElements` utility to use a for loop instead of the native filter function ## [2.3.3] - 2016-08-02 ### Added - add error callback on image loading (#508) ### Fixed - fixed bug when getting bbox of text elements which are not in the dom (#514) - fixed bug when getting bbox of element which is hidden with css (#516) ## [2.3.2] - 2016-06-21 ### Added - added specs for `SVG.ViewBox` - added `parent` parameter for `clone()` - added spec for mentioned issue ### Fixed - fixed string parsing in viewbox (#483) - fixed bbox when element is not in the dom (#480) - fixed line constructor which doesn't work with Array as input (#487) - fixed problem in IE with `document.contains` (#490) related to (#480) - fixed `undo` when undoing transformations (#494) ## [2.3.1] - 2016-05-05 ### Added - added typings for svg.js (#470) ### Fixed - fixed `SVG.morph()` (#473) - fixed parser error (#471) - fixed bug in `SVG.Color` with new fx - fixed `radius()` for circles when animating and other related code (#477) - fixed bug where `stop(true)` throws an error when element is not animated (#475) - fixed bug in `add()` when altering svgs with whitespaces - fixed bug in `SVG.Doc().create` where size was set to 100% even if size was already specified - fixed bug in `parse()` from `SVG.PathArray` which does not correctly handled `S` and `T` (#485) ## [2.3.0] - 2016-03-30 ### Added - added `SVG.Point` which serves as Wrapper to the native `SVGPoint` (#437) - added `element.point(x,y)` which transforms a point from screen coordinates to the elements space (#403) - added `element.is()` which helps to check for the object instance faster (instanceof check) - added more fx specs ### Changed - textpath now is a parent element, the lines method of text will return the tspans inside the textpath (#450) - fx module rewritten to support animation chaining and several other stuff (see docs) ### Fixed - fixed `svgjs:data` attribute which was not set properly in all browsers (#428) - fixed `isNumber` and `numberAndUnit` regex (#405) - fixed error where a parent node is not found when loading an image but the canvas was cleared (#447) - fixed absolute transformation animations (not perfect but better) - fixed event listeners which didnt work correctly when identic funtions used ## [2.2.5] - 2015-12-29 ### Added - added check for existence of node (#431) ### Changed - `group.move()` now allows string numbers as input (#433) - `matrixify()` will not apply the calculated matrix to the node anymore ## [2.2.4] - 2015-12-12 ### Fixed - fixed `transform()` which returns the matrix values (a-f) now, too (#423) - double newlines (\n\n) are correctly handled as blank line from `text()` - fixed use of scrollX vs pageXOffset in `rbox()` (#425) - fixed target array in mask and clip which was removed instead of reinitialized (#429) ## [2.2.3] - 2015-11-30 ### Fixed - fixed null check in image (see 2.2.2) - fixed bug related to the new path parser (see 2.2.2) - fixed amd loader (#412) ## [2.2.2] - 2015-11-28 ### Added - added null check in image onload callback (#415) ### Changed - documentation rework (#407) [thanks @snowyplover] ### Fixed - fixed leading point bug in path parsing (#416) ## [2.2.1] - 2015-11-18 ### Added - added workaround for `SvgPathSeg` which is removed in Chrome 48 (#409) - added `gbox()` to group to get bbox with translation included (#405) ### Fixed - fixed dom data which was not cleaned up properly (#398) ## [2.2.0] - 2015-11-06 ### Added - added `ungroup()/flatten()` (#238), `toParent()` and `toDoc()` - added UMD-Wrapper with possibility to pass custom window object (#352) - added `morph()` method for paths via plugin [svg.pathmorphing.js](https://github.com/Fuzzyma/svg.pathmorphing.js) - added support for css selectors within the `parent()` method - added `parents()` method to get an array of all parenting elements ### Changed - svgjs now saves crucial data in the dom before export and restores them when element is adopted ### Fixed - fixed pattern and gradient animation (#385) - fixed mask animation in Firefox (#287) - fixed return value of `text()` after import/clone (#393) ## [2.1.1] - 2015-10-03 ### Added - added custom context binding to event callback (default is the element the event is bound to) ## [2.1.0] - 2015-09-20 ### Added - added transform to pattern and gradients (#383) ### Fixed - fixed clone of textnodes (#369) - fixed transformlists in IE (#372) - fixed typo that leads to broken gradients (#370) - fixed animate radius for circles (#367) ## [2.0.2] - 2015-06-22 ### Fixed - Fixed zoom consideration in circle and ellipse ## [2.0.1] - 2015-06-21 ### Added - added possibility to remove all events from a certain namespace ### Fixed - fixed bug with `doc()` which always should return root svg - fixed bug in `SVG.FX` when animating with `plot()` ### Removed - removed target reference from use which caused bugs in `dmove()` and `use()` with external file - removed scale consideration in `move()` duo to incompatibilities with other move-functions e.g. in `SVG.PointArray` ## [2.0.0] - 2015-06-11 ### Added - implemented an SVG adoption system to be able to manipulate existing SVG's not created with svg.js - added polyfill for IE9 and IE10 custom events [thanks @Fuzzyma] - added DOM query selector with the `select()` method globally or on parent elements - added the intentionally neglected `SVG.Circle` element - added `rx()` and `ry()` to `SVG.Rect`, `SVG.Circle`, `SVG.Ellispe` and `SVG.FX` - added support to clone manually built text elements - added `svg.wiml.js` plugin to plugins list - added `ctm()` method to for matrix-centric transformations - added `morph()` method to `SVG.Matrix` - added support for new matrix system to `SVG.FX` - added `native()` method to elements and matrix to get to the native api - added `untransform()` method to remove all transformations - added raw svg import functionality with the `svg()` method - added coding style description to README - added reverse functionality for animations - documented the `situation` object in `SVG.FX` - added distinction between relative and absolute matrix transformations - implemented the `element()` method using the `SVG.Bare` class to create elements that are not described by SVG.js - added `w` and `h` properties as shorthand for `width` and `height` to `SVG.BBox` - added `SVG.TBox` to get a bounding box that is affected by transformation values - added event-based or complete detaching of event listeners in `off()` method ### Changed - changed `parent` reference on elements to `parent()` method - using `CustomEvent` instead of `Event` to be able to fire events with a `detail` object [thanks @Fuzzyma] - renamed `SVG.TSpan` class to `SVG.Tspan` to play nice with the adoption system - completely reworked `clone()` method to use the adoption system - completely reworked transformations to be chainable and more true to their nature - changed `lines` reference to `lines()` on `SVG.Text` - changed `track` reference to `track()` on `SVG.Text` - changed `textPath` reference to `textPath()` on `SVG.Text` - changed `array` reference to `array()` method on `SVG.Polyline`, `SVG.Polygon` and `SVG.Path` - reworked sup-pixel offset implementation to be more compact - switched from Ruby's `rake` to Node's `gulp` for building [thanks to Alex Ewerlöf] - changed `to()` method to `at()` method in `SVG.FX` - renamed `SVG.SetFX` to `SVG.FX.Set` - reworked `SVG.Number` to return new instances with calculations rather than itself - reworked animatable matrix rotations - removed `SVG.Symbol` but kept the `symbol()` method using the new `element()` method ### Fixed - fixed bug in `radius()` method when `y` value equals `0` - fixed a bug where events are not detached properly ## [1.0.0-rc.9] - 2014-06-17 ### Added - added `SVG.Marker` - added `SVG.Symbol` - added `first()` and `last()` methods to `SVG.Set` - added `length()` method to `SVG.Text` and `SVG.TSpan` to calculate total text length - added `reference()` method to get referenced elements from a given attribute value ### Changed - `SVG.get()` will now also fetch elements with a `xlink:href="#elementId"` or `url(#elementId)` value given ### Fixed - fixed infinite loop in viewbox when element has a percentage width / height [thanks @shabegger] ## [1.0.0-rc.8] - 2014-06-12 ### Fixed - fixed bug in `SVG.off` - fixed offset by window scroll position in `rbox()` [thanks @bryhoyt] ## [1.0.0-rc.7] - 2014-06-11 ### Added - added `classes()`, `hasClass()`, `addClass()`, `removeClass()` and `toggleClass()` [thanks @pklingem] ### Changed - binding events listeners to svg.js instance - calling `after()` when calling `stop(true)` (fulfill flag) [thanks @vird] - text element fires `rebuild` event whenever the `rebuild()` method is called ### Fixed - fixed a bug where `Element#style()` would not save empty values in IE11 [thanks @Shtong] - fixed `SVG is not defined error` [thanks @anvaka] - fixed a bug in `move()`on text elements with a string based value - fix for `text()` method on text element when acting as getter [thanks @Lochemage] - fix in `style()` method with a css string [thanks @TobiasHeckel] ## [1.0.0-rc.6] - 2014-03-03 ### Added - added `leading()` method to `SVG.FX` - added `reverse()` method to `SVG.Array` (and thereby also to `SVG.PointArray` and `SVG.PathArray`) - added `fulfill` option to `stop()` method in `SVG.FX` to finalise animations - added more output values to `bbox()` and `rbox()` methods ### Changed - fine-tuned text element positioning - calling `at()` method directly on morphable svg.js instances in `SVG.FX` module - moved most `_private` methods to local named functions - moved helpers to a separate file ### Fixed - fixed a bug in text `dy()` method ### Removed - removed internal representation for `style` ## [1.0.0-rc.5] - 2014-02-14 ### Added - added `plain()` method to `SVG.Text` element to add plain text content, without tspans - added `plain()` method to parent elements to create a text element without tspans - added `build()` to enable/disable build mode ### Changed - updated `SVG.TSpan` to accept nested tspan elements, not unlike the `text()` method in `SVG.Text` - removed the `relative()` method in favour of `dx()`, `dy()` and `dmove()` - switched form objects to arrays in `SVG.PathArray` for compatibility with other libraries and better performance on parsing and rendering (up-to 48% faster than 1.0.0-rc.4) - refined docs on element-specific methods and `SVG.PathArray` structure - reworked `leading()` implementation to be more font-size "aware" - refactored the `attr` method on `SVG.Element` - applied Helvetica as default font - building `SVG.FX` class with `SVG.invent()` function ### Removed - removed verbose style application to tspans ## [1.0.0-rc.4] - 2014-02-04 ### Added - automatic pattern creation by passing an image url or instance as `fill` attribute on elements - added `loaded()` method to image tag - added `pointAt()` method to `SVG.Path`, wrapping the native `getPointAtLength()` ### Changed - switched to `MAJOR`.`MINOR`.`PATCH` versioning format to play nice with package managers - made svg.pattern.js part of the core library - moved `length()` method to sugar module ### Fixed - fix in `animate('=').to()` - fix for arcs in patharray `toString()` method [thanks @dotnetCarpenter] ## [v1.0rc3] - 2014-02-03 ### Added - added the `SVG.invent` function to ease invention of new elements - added second values for `animate('2s')` - added `length()` mehtod to path, wrapping the native `getTotalLength()` ### Changed - using `SVG.invent` to generate core shapes as well for leaner code ### Fixed - fix for html-less documents - fix for arcs in patharray `toString()` method ## [v1.0rc2] - 2014-02-01 ### Added - added `index()` method to `SVG.Parent` and `SVG.Set` - added `morph()` and `at()` methods to `SVG.Number` for unit morphing ### Changed - modified `cx()` and `cy()` methods on elements with native `x`, `y`, `width` and `height` attributes for better performance ## [v1.0rc1] - 2014-01-31 ### Added - added `SVG.PathArray` for real path transformations - added `bbox()` method to `SVG.Set` - added `relative()` method for moves relative to the current position - added `morph()` and `at()` methods to `SVG.Color` for color morphing ### Changed - enabled proportional resizing on `size()` method with `null` for either `width` or `height` values - moved data module to separate file - `data()` method now accepts object for for multiple key / value assignments ### Removed - removed `unbiased` system for paths ## [v0.38] - 2014-01-28 ### Added - added `loop()` method to `SVG.FX` ### Changed - switched from `setInterval` to `requestAnimFrame` for animations ## [v0.37] - 2014-01-26 ### Added - added `get()` to `SVG.Set` ### Changed - moved `SVG.PointArray` to a separate file ## [v0.36] - 2014-01-25 ### Added - added `linkTo()`, `addTo()` and `putIn()` methods on `SVG.Element` ### Changed - provided more detailed documentation on parent elements ### Fixed ## [v0.35] - 2014-01-23 ### Added - added `SVG.A` element with the `link()` ## [v0.34] - 2014-01-23 ### Added - added `pause()` and `play()` to `SVG.FX` ### Changed - storing animation values in `situation` object ## [v0.33] - 2014-01-22 ### Added - added `has()` method to `SVG.Set` - added `width()` and `height()` as setter and getter methods on all shapes - added `replace()` method to elements - added `radius()` method to `SVG.Rect` and `SVG.Ellipse` - added reference to parent node in defs ### Changed - moved sub-pixel offset fix to be an optional method (e.g. `SVG('drawing').fixSubPixelOffset()`) - merged plotable.js and path.js ## [v0.32] ### Added - added library to [cdnjs](http://cdnjs.com) [3.2.4]: https://github.com/svgdotjs/svg.js/releases/tag/3.2.4 [3.2.3]: https://github.com/svgdotjs/svg.js/releases/tag/3.2.3 [3.2.2]: https://github.com/svgdotjs/svg.js/releases/tag/3.2.2 [3.2.1]: https://github.com/svgdotjs/svg.js/releases/tag/3.2.1 [3.2.0]: https://github.com/svgdotjs/svg.js/releases/tag/3.2.0 [3.1.2]: https://github.com/svgdotjs/svg.js/releases/tag/3.1.2 [3.1.1]: https://github.com/svgdotjs/svg.js/releases/tag/3.1.1 [3.1.0]: https://github.com/svgdotjs/svg.js/releases/tag/3.1.0 [3.0.16]: https://github.com/svgdotjs/svg.js/releases/tag/3.0.16 [3.0.15]: https://github.com/svgdotjs/svg.js/releases/tag/3.0.15 [3.0.14]: https://github.com/svgdotjs/svg.js/releases/tag/3.0.14 [3.0.13]: https://github.com/svgdotjs/svg.js/releases/tag/3.0.13 [3.0.12]: https://github.com/svgdotjs/svg.js/releases/tag/3.0.12 [3.0.11]: https://github.com/svgdotjs/svg.js/releases/tag/3.0.11 [3.0.10]: https://github.com/svgdotjs/svg.js/releases/tag/3.0.10 [3.0.9]: https://github.com/svgdotjs/svg.js/releases/tag/3.0.9 [3.0.8]: https://github.com/svgdotjs/svg.js/releases/tag/3.0.8 [3.0.7]: https://github.com/svgdotjs/svg.js/releases/tag/3.0.7 [3.0.6]: https://github.com/svgdotjs/svg.js/releases/tag/3.0.6 [3.0.5]: https://github.com/svgdotjs/svg.js/releases/tag/3.0.5 [3.0.4]: https://github.com/svgdotjs/svg.js/releases/tag/3.0.4 [3.0.3]: https://github.com/svgdotjs/svg.js/releases/tag/3.0.3 [3.0.2]: https://github.com/svgdotjs/svg.js/releases/tag/3.0.2 [3.0.1]: https://github.com/svgdotjs/svg.js/releases/tag/3.0.1 [3.0.0]: https://github.com/svgdotjs/svg.js/releases/tag/3.0.0 [2.7.1]: https://github.com/svgdotjs/svg.js/releases/tag/2.7.1 [2.7.0]: https://github.com/svgdotjs/svg.js/releases/tag/2.7.0 [2.6.6]: https://github.com/svgdotjs/svg.js/releases/tag/2.6.6 [2.6.5]: https://github.com/svgdotjs/svg.js/releases/tag/2.6.5 [2.6.4]: https://github.com/svgdotjs/svg.js/releases/tag/2.6.4 [2.6.3]: https://github.com/svgdotjs/svg.js/releases/tag/2.6.3 [2.6.2]: https://github.com/svgdotjs/svg.js/releases/tag/2.6.2 [2.6.1]: https://github.com/svgdotjs/svg.js/releases/tag/2.6.1 [2.6.0]: https://github.com/svgdotjs/svg.js/releases/tag/2.6.0 [2.5.3]: https://github.com/svgdotjs/svg.js/releases/tag/2.5.3 [2.5.2]: https://github.com/svgdotjs/svg.js/releases/tag/2.5.2 [2.5.1]: https://github.com/svgdotjs/svg.js/releases/tag/2.5.1 [2.5.0]: https://github.com/svgdotjs/svg.js/releases/tag/2.5.0 [2.4.0]: https://github.com/svgdotjs/svg.js/releases/tag/2.4.0 [2.3.7]: https://github.com/svgdotjs/svg.js/releases/tag/2.3.7 [2.3.6]: https://github.com/svgdotjs/svg.js/releases/tag/2.3.6 [2.3.5]: https://github.com/svgdotjs/svg.js/releases/tag/2.3.5 [2.3.4]: https://github.com/svgdotjs/svg.js/releases/tag/2.3.4 [2.3.3]: https://github.com/svgdotjs/svg.js/releases/tag/2.3.3 [2.3.2]: https://github.com/svgdotjs/svg.js/releases/tag/2.3.2 [2.3.1]: https://github.com/svgdotjs/svg.js/releases/tag/2.3.1 [2.3.0]: https://github.com/svgdotjs/svg.js/releases/tag/2.3.0 [2.2.5]: https://github.com/svgdotjs/svg.js/releases/tag/2.2.5 [2.2.4]: https://github.com/svgdotjs/svg.js/releases/tag/2.2.4 [2.2.3]: https://github.com/svgdotjs/svg.js/releases/tag/2.2.3 [2.2.2]: https://github.com/svgdotjs/svg.js/releases/tag/2.2.2 [2.2.1]: https://github.com/svgdotjs/svg.js/releases/tag/2.2.1 [2.2.0]: https://github.com/svgdotjs/svg.js/releases/tag/2.2.0 [2.1.1]: https://github.com/svgdotjs/svg.js/releases/tag/2.1.1 [2.1.0]: https://github.com/svgdotjs/svg.js/releases/tag/2.1.0 [2.0.2]: https://github.com/svgdotjs/svg.js/releases/tag/2.0.2 [2.0.1]: https://github.com/svgdotjs/svg.js/releases/tag/2.0.1 [2.0.0]: https://github.com/svgdotjs/svg.js/releases/tag/2.0.0 [1.0.0-rc.9]: https://github.com/svgdotjs/svg.js/releases/tag/1.0.0-rc.9 [1.0.0-rc.8]: https://github.com/svgdotjs/svg.js/releases/tag/1.0.0-rc.8 [1.0.0-rc.7]: https://github.com/svgdotjs/svg.js/releases/tag/1.0.0-rc.7 [1.0.0-rc.6]: https://github.com/svgdotjs/svg.js/releases/tag/1.0.0-rc.6 [1.0.0-rc.5]: https://github.com/svgdotjs/svg.js/releases/tag/1.0.0-rc.5 [1.0.0-rc.4]: https://github.com/svgdotjs/svg.js/releases/tag/1.0.0-rc.4 [v1.0rc3]: https://github.com/svgdotjs/svg.js/releases/tag/1.0rc3 [v1.0rc2]: https://github.com/svgdotjs/svg.js/releases/tag/1.0rc2 [v1.0rc1]: https://github.com/svgdotjs/svg.js/releases/tag/1.0rc1 [v0.38]: https://github.com/svgdotjs/svg.js/releases/tag/0.38 [v0.37]: https://github.com/svgdotjs/svg.js/releases/tag/0.37 [v0.36]: https://github.com/svgdotjs/svg.js/releases/tag/0.36 [v0.35]: https://github.com/svgdotjs/svg.js/releases/tag/0.35 [v0.34]: https://github.com/svgdotjs/svg.js/releases/tag/0.34 [v0.33]: https://github.com/svgdotjs/svg.js/releases/tag/0.33 [v0.32]: https://github.com/svgdotjs/svg.js/releases/tag/0.32 svg.js-3.2.4/LICENSE.txt000066400000000000000000000021011463723416200145570ustar00rootroot00000000000000Copyright (c) 2012-2018 Wout Fierens https://svgdotjs.github.io/ 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. svg.js-3.2.4/README.md000066400000000000000000000033141463723416200142220ustar00rootroot00000000000000# SVG.js [![Build Status](https://travis-ci.org/svgdotjs/svg.js.svg?branch=master)](https://travis-ci.org/svgdotjs/svg.js) [![Coverage Status](https://coveralls.io/repos/github/svgdotjs/svg.js/badge.svg?branch=master)](https://coveralls.io/github/svgdotjs/svg.js?branch=master) [![Cdnjs](https://img.shields.io/cdnjs/v/svg.js.svg)](https://cdnjs.com/libraries/svg.js) [![jsdelivr](https://badgen.net/jsdelivr/v/npm/@svgdotjs/svg.js)](https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js) [![Join the chat at https://gitter.im/svgdotjs/svg.js](https://badges.gitter.im/svgdotjs/svg.js.svg)](https://gitter.im/svgdotjs/svg.js?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Twitter](https://img.shields.io/badge/Twitter-@svg__js-green.svg)](https://twitter.com/svg_js) **A lightweight library for manipulating and animating SVG, without any dependencies.** SVG.js is licensed under the terms of the MIT License. ## Installation #### Npm: `npm install @svgdotjs/svg.js` #### Yarn: `yarn add @svgdotjs/svg.js` #### CDNs: [https://cdnjs.com/libraries/svg.js](https://cdnjs.com/libraries/svg.js) [https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js](https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js) [https://unpkg.com/@svgdotjs/svg.js](https://unpkg.com/@svgdotjs/svg.js) ## Documentation Check [svgjs.dev](https://svgjs.dev/docs/3.0/) to learn more. [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=ulima.ums%40googlemail.com&lc=US&item_name=SVG.JS¤cy_code=EUR&bn=PP-DonationsBF%3Abtn_donate_74x21.png%3ANonHostedGuest) or [![Sponsor](https://img.shields.io/badge/Sponsor-svg.js-green.svg)](https://github.com/sponsors/Fuzzyma) svg.js-3.2.4/bench/000077500000000000000000000000001463723416200140215ustar00rootroot00000000000000svg.js-3.2.4/bench/runner.html000066400000000000000000000031341463723416200162210ustar00rootroot00000000000000 SVG.js benchmarker
svg.js-3.2.4/bench/svg.bench.js000066400000000000000000000037241463723416200162420ustar00rootroot00000000000000/* global Snap */ ;(function () { SVG.bench = { // Initalize test store _chain: [], _before: function () {}, _after: function () {}, draw: SVG().addTo('#draw'), snap: Snap(100, 100), raw: document.getElementById('native'), // Add descriptor describe: function (name, closure) { this._chain.push({ name: name, run: closure }) return this }, // Add test test: function (name, run) { // run test var start = new Date().getTime() run() this.write(name, new Date().getTime() - start) // clear everything this.clear() }, // Skip test skip: function (name, run) { this.write(name, false) }, // Run tests run: function () { this.pad() for (var h, i = 0, il = this._chain.length; i < il; i++) { h = document.createElement('h1') h.innerHTML = this._chain[i].name this.pad().appendChild(h) this._chain[i].run(this) } }, // Write result write: function (name, ms) { var test = document.createElement('div') if (typeof ms === 'number') { test.className = 'test' test.innerHTML = '' + name + ' completed in ' + ms + 'ms' } else { test.className = 'test skipped' test.innerHTML = name + ' (skipped)' } this.pad().appendChild(test) return this }, // Reference writable element pad: function () { var pad = document.getElementById('pad') if (!pad) { pad = document.createElement('div') document.getElementsByTagName('body')[0].appendChild(pad) } return pad }, // Clear canvasses clear: function () { while (this.raw.hasChildNodes()) { this.raw.removeChild(this.raw.lastChild) } this.draw.clear() this.snap.clear() } } })() svg.js-3.2.4/bench/tests/000077500000000000000000000000001463723416200151635ustar00rootroot00000000000000svg.js-3.2.4/bench/tests/10000-accesses.js000066400000000000000000000017611463723416200177550ustar00rootroot00000000000000SVG.bench.describe( 'Access a dom attributes vs dom properties vs object properties', function (bench) { bench.test('using an object', function () { var sum = 0 var obj = { x: '30' } for (var i = 0; i < 1000000; i++) { sum += obj.x * i } console.log(sum) }) bench.test('figure out what the overhead is', function () { var obj = bench.draw.rect(100, 100).move(0, 0) }) bench.test('using dom attributes', function () { var sum = 0 var obj = bench.draw.rect(100, 100).move(0, 0) var node = obj.node for (var i = 0; i < 1000000; i++) { sum += node.getAttribute('x') * i } console.log(sum, node.getAttribute('x')) }) bench.test('using dom properties', function () { var sum = 0 var obj = bench.draw.rect(100, 100).move(0, 0) var node = obj.node for (var i = 0; i < 1000000; i++) { sum += node.x.baseVal * i } console.log(sum, node.x) }) } ) svg.js-3.2.4/bench/tests/10000-boxes.js000066400000000000000000000030351463723416200173000ustar00rootroot00000000000000SVG.bench.describe('Generate 100000 bbox', function (bench) { var rect = bench.draw.rect(100, 100) bench.test('using SVG.js v3.0.0', function () { for (var i = 0; i < 100000; i++) rect.bbox() }) //bench.test('using vanilla js', function() { // var node = rect.node // for (var i = 0; i < 10000; i++) { // node.getBBox() // } //}) //bench.test('using Snap.svg v0.5.1', function() { // for (var i = 0; i < 10000; i++) // bench.snap.rect(50, 50, 100, 100) //}) }) SVG.bench.describe('Generate 100000 rbox', function (bench) { var rect = bench.draw.rect(100, 100) bench.test('using SVG.js v3.0.0', function () { for (var i = 0; i < 100000; i++) rect.bbox() }) //bench.test('using vanilla js', function() { // var node = rect.node // for (var i = 0; i < 10000; i++) { // node.getBoundingClientRect() // } //}) //bench.test('using Snap.svg v0.5.1', function() { // for (var i = 0; i < 10000; i++) // bench.snap.rect(50, 50, 100, 100) //}) }) SVG.bench.describe('Generate 100000 viewbox', function (bench) { var nested = bench.draw.nested().viewbox(10, 10, 100, 100) bench.test('using SVG.js v3.0.0', function () { for (var i = 0; i < 100000; i++) nested.viewbox() }) //bench.test('using vanilla js', function() { // var node = rect.node // for (var i = 0; i < 10000; i++) { // node.getAttribute('viewBox') // } //}) //bench.test('using Snap.svg v0.5.1', function() { // for (var i = 0; i < 10000; i++) // bench.snap.rect(50, 50, 100, 100) //}) }) svg.js-3.2.4/bench/tests/10000-circles.js000066400000000000000000000024171463723416200176070ustar00rootroot00000000000000SVG.bench.describe('Generate 10000 circles', function (bench) { bench.test('using SVG.js v2.5.3', function () { for (var i = 0; i < 10000; i++) bench.draw.circle(100, 100) }) bench.test('using vanilla js', function () { for (var i = 0; i < 10000; i++) { var circle = document.createElementNS(SVG.ns, 'circle') circle.setAttributeNS(null, 'rx', 50) circle.setAttributeNS(null, 'ry', 50) bench.raw.appendChild(circle) } }) bench.test('using Snap.svg v0.5.1', function () { for (var i = 0; i < 10000; i++) bench.snap.circle(50, 50, 100, 100) }) }) SVG.bench.describe('Generate 10000 circles with fill', function (bench) { bench.test('using SVG.js v2.5.3', function () { for (var i = 0; i < 10000; i++) bench.draw.circle(100, 100).fill('#f06') }) bench.test('using vanilla js', function () { for (var i = 0; i < 10000; i++) { var circle = document.createElementNS(SVG.ns, 'circle') circle.setAttributeNS(null, 'rx', 50) circle.setAttributeNS(null, 'ry', 50) circle.setAttributeNS(null, 'fill', '#f06') bench.raw.appendChild(circle) } }) bench.test('using Snap.svg v0.5.1', function () { for (var i = 0; i < 10000; i++) bench.snap.circle(50, 50, 100, 100).attr('fill', '#f06') }) }) svg.js-3.2.4/bench/tests/10000-each.js000066400000000000000000000010101463723416200170470ustar00rootroot00000000000000SVG.bench.describe('each() vs forEach()', function (bench) { // preparation var list = [] for (var i = 99; i >= 0; i--) list.push(bench.draw.rect(100, 50)) var set = new SVG.Set(list) bench.test('10000 x each()', function () { for (var i = 0; i < 10000; i++) { set.each(function () { this.fill('#f06') }) } }) bench.test('10000 x forEach()', function () { for (var i = 0; i < 10000; i++) { list.forEach(function (e) { e.fill('#f06') }) } }) }) svg.js-3.2.4/bench/tests/10000-pathArray-bbox.js000066400000000000000000000416261463723416200210530ustar00rootroot00000000000000SVG.bench.describe('Generate 10000 pathArrays bbox', function (bench) { var data = 'M97.499,75.211l5.652,-4.874c-1.235,-3.156 -2.115,-6.44 -2.623,-9.791l-8.313,-1.582c-0.345,-3.501 -0.345,-7.027 0,-10.527l8.313,-1.582c0.508,-3.351 1.388,-6.635 2.623,-9.791l-6.408,-5.526c1.452,-3.204 3.215,-6.258 5.263,-9.117l7.99,2.787c2.116,-2.648 4.52,-5.052 7.168,-7.168l-2.787,-7.99c2.86,-2.049 5.913,-3.812 9.117,-5.263l5.526,6.408c3.156,-1.236 6.44,-2.115 9.791,-2.624l1.582,-8.312c3.501,-0.345 7.027,-0.345 10.527,0l1.582,8.312c3.351,0.509 6.635,1.388 9.791,2.624l5.526,-6.408c3.204,1.451 6.258,3.214 9.117,5.263l-2.787,7.99c2.648,2.116 5.052,4.52 7.168,7.168l7.99,-2.787c2.049,2.859 3.812,5.913 5.263,9.117l-6.408,5.526c1.236,3.156 2.115,6.44 2.624,9.791l8.312,1.582c0.345,3.5 0.345,7.026 0,10.527l-8.312,1.582c-0.509,3.351 -1.388,6.635 -2.624,9.791l6.408,5.526c-1.451,3.204 -3.214,6.257 -5.263,9.117l-7.99,-2.787c-2.116,2.648 -4.52,5.052 -7.168,7.168l2.787,7.99c-2.859,2.048 -5.913,3.811 -9.117,5.263l-5.526,-6.408c-3.156,1.235 -6.44,2.115 -9.791,2.624l-1.444,7.589l0.16,0.015l1.582,8.313c3.351,0.508 6.635,1.388 9.791,2.624l5.526,-6.409c3.204,1.452 6.258,3.215 9.117,5.264l-2.787,7.99c2.648,2.116 5.052,4.52 7.168,7.167l7.99,-2.786c2.049,2.859 3.812,5.913 5.263,9.117l-6.408,5.526c1.235,3.156 2.115,6.44 2.624,9.791l8.312,1.582c0.345,3.5 0.345,7.026 0,10.527l-8.312,1.581c-0.509,3.351 -1.389,6.635 -2.624,9.792l6.408,5.526c-1.451,3.204 -3.214,6.257 -5.263,9.116l-7.99,-2.786c-2.116,2.648 -4.52,5.052 -7.168,7.168l2.787,7.989c-2.859,2.049 -5.913,3.812 -9.117,5.264l-5.526,-6.408c-3.156,1.235 -6.44,2.115 -9.791,2.623l-1.582,8.313c-3.5,0.345 -7.026,0.345 -10.527,0l-1.582,-8.313c-3.351,-0.508 -6.635,-1.388 -9.791,-2.623l-5.526,6.408c-3.204,-1.452 -6.258,-3.215 -9.117,-5.264l2.787,-7.989c-2.648,-2.116 -5.052,-4.52 -7.168,-7.168l-7.99,2.786c-2.048,-2.859 -3.811,-5.912 -5.263,-9.116l6.408,-5.526c-1.235,-3.157 -2.115,-6.441 -2.624,-9.792l-8.312,-1.581c-0.345,-3.501 -0.345,-7.027 0,-10.527l8.312,-1.582c0.509,-3.351 1.389,-6.635 2.624,-9.791l-6.408,-5.526c0.034,-0.076 0.068,-0.151 0.103,-0.226l-7.783,-2.714c-2.116,2.648 -4.52,5.052 -7.168,7.167l2.787,7.99c-2.86,2.049 -5.913,3.812 -9.117,5.264l-5.526,-6.408c-3.156,1.235 -6.44,2.115 -9.791,2.623l-1.582,8.313c-3.501,0.345 -7.027,0.345 -10.527,0l-1.582,-8.313c-3.351,-0.508 -6.635,-1.388 -9.791,-2.623l-5.526,6.408c-3.204,-1.452 -6.258,-3.215 -9.117,-5.264l2.787,-7.99c-2.648,-2.115 -5.052,-4.519 -7.168,-7.167l-7.99,2.786c-2.049,-2.859 -3.812,-5.913 -5.263,-9.116l6.408,-5.527c-1.236,-3.156 -2.115,-6.44 -2.624,-9.791l-8.312,-1.581c-0.345,-3.501 -0.345,-7.027 0,-10.528l8.312,-1.581c0.509,-3.351 1.388,-6.635 2.624,-9.791l-6.408,-5.527c1.451,-3.204 3.214,-6.257 5.263,-9.116l7.99,2.786c2.116,-2.648 4.52,-5.052 7.168,-7.167l-2.787,-7.99c2.859,-2.049 5.913,-3.812 9.117,-5.264l5.526,6.408c3.156,-1.235 6.44,-2.115 9.791,-2.623l1.582,-8.313c3.5,-0.345 7.026,-0.345 10.527,0l1.582,8.313c3.351,0.508 6.635,1.388 9.791,2.623l5.526,-6.408c3.204,1.452 6.257,3.215 9.117,5.264l-2.787,7.99c2.648,2.115 5.052,4.519 7.168,7.167l7.99,-2.786c0.049,0.069 0.099,0.139 0.148,0.209Zm48.456,73.925c5.927,0 10.74,4.813 10.74,10.74c0,5.928 -4.813,10.74 -10.74,10.74c-5.928,0 -10.741,-4.812 -10.741,-10.74c0,-5.927 4.813,-10.74 10.741,-10.74Zm-5.402,-41.978l-0.16,-0.016l-1.582,-8.312c-3.351,-0.509 -6.635,-1.389 -9.791,-2.624l-5.526,6.408c-3.204,-1.452 -6.257,-3.215 -9.117,-5.263l2.787,-7.99c-2.648,-2.116 -5.052,-4.52 -7.168,-7.168l-7.99,2.787c-0.049,-0.07 -0.099,-0.139 -0.148,-0.209l-5.652,4.874c1.235,3.156 2.115,6.44 2.624,9.791l8.312,1.581c0.345,3.501 0.345,7.027 0,10.528l-8.312,1.581c-0.509,3.351 -1.389,6.635 -2.624,9.791l6.408,5.527c-0.034,0.075 -0.068,0.15 -0.103,0.225l7.783,2.714c2.116,-2.647 4.52,-5.051 7.168,-7.167l-2.787,-7.99c2.859,-2.049 5.913,-3.812 9.117,-5.264l5.526,6.409c3.156,-1.236 6.44,-2.116 9.791,-2.624l1.444,-7.589Zm-86.853,-11.617c5.928,0 10.74,4.812 10.74,10.74c0,5.928 -4.812,10.74 -10.74,10.74c-5.927,0 -10.74,-4.812 -10.74,-10.74c0,-5.928 4.813,-10.74 10.74,-10.74Zm91.957,-52.581c5.927,0 10.74,4.813 10.74,10.74c0,5.928 -4.813,10.74 -10.74,10.74c-5.928,0 -10.74,-4.812 -10.74,-10.74c0,-5.927 4.812,-10.74 10.74,-10.74Z' var data2 = 'M0.48858732019046247.35239897640279355L0.5168962223329727.32957811442929225C0.5107105368860513.31480120831760355.5063029229643583.2994249853547438.5037585276550173.2837350574775992L0.46212160205156927.2763278757701558C0.46039361704817827.25993562345804494.46039361704817827.2434263170734397.46212160205156927.22703874692422862L0.5037585276550173.2196315652167852C0.5063029229643582.20394163733964055.5107105368860513.1885654143767808.5168962223329727.17378850826509218L0.4848007791395535.14791487608093778C0.492073342110347.13291322615006.5009035959102843.11861390065414837.5111613155825881.1052275969236928L0.5511804465306873.11827678492536459C0.5617787545514856.10587841756676146.5738195544012016.09462249795570335.5870824653837506.0847150412597803L0.5731233517476615.047304559690581297C0.5874480969931638.037710807908943156.6027395121101284.02945615471664055.6187872337068381.022662336349067613L0.6464650456741969.052665636210823215C0.6622723519660869.046878482866701814.678720765737496.04276286167779995.6955047592052157.040379640761814675L0.7034284469598956.0014615027388882582C0.7209637382551767 -0.0001538434615339766.7386242458550512 -0.0001538434615339766.7561545284981485.0014615027388882582L0.7640782162528285.040379640761814675C0.7808622097205482.04276286167779995.7973106234919571.046878482866701814.8131179297838472.052665636210823215L0.8407957417512061.022662336349067617C0.8568434633479157.02945615471664055.872139887117064.037710807908943156.8864596237103826.04730455969058131L0.8725005100742934.0847150412597803C0.8857634210568424.09462249795570335.8978042209065583.10587841756676146.9084025289273567.11827678492536459L0.948421659875456.1052275969236928C0.9586843881999436.11861390065414837.9675146419998809.13291322615006.9747821963184906.14791487608093778L0.9426867531250714.17378850826509218C0.9488774472241766.1885654143767808.953280052493686.20394163733964055.9558294564552107.2196315652167852L0.9974613734064749.22703874692422862C0.9991893584098659.2434263170734397.9991893584098659.25993562345804494.9974613734064749.2763278757701558L0.9558294564552107.2837350574775992C0.953280052493686.2994249853547438.9488774472241766.31480120831760366.9426867531250714.32957811442929225L0.9747821963184906.3554517466134466C0.9675146419998809.37045339654432435.9586843881999436.38474803987733625.948421659875456.3981390257706916L0.9084025289273567.3850898377690198C0.8978042209065583.3974882051276229.8857634210568424.40874412473868105.8725005100742934.41865158143460407L0.8864596237103826.4560620630038031C0.8721398871170639.46565113262254143.8568434633479156.4739057858148441.8407957417512061.4807042863453168L0.8131179297838472.45070098648356116C0.7973106234919571.4564834576647828.7808622097205482.4606037610165844.7640782162528285.4629869819325697L0.756845722499505.4985199161789591L0.7576471068489037.4985901486224557L0.7655707946035836.5375129688082819C0.7823547880713033.5398915075613674.7988032018427124.5440118109131691.8146105081346023.5497989642572905L0.8422883201019612.519790982232635C0.8583360416986708.5265894827631077.8736324654678193.5348441359554104.8879522020611378.5444378877370485L0.8739930884250485.5818483693062474C0.8872559994075976.5917558260021705.8992967992573135.6030117456132287.9098951072781118.615405430808932L0.9499142382262111.6023609249701599C0.9601769665506987.6157472287006156.969007220350636.6300465541965272.9762747746692458.6450482041274048L0.9441793314758266.6709218363115593C0.9503650169227481.685698742423248.9547726308444411.7010749653861077.9573220348059658.7167648932632523L0.9989539517572301.7241720749706957C1.000681936760621.7405596451199068 1.000681936760621.757068951504512.9989539517572301.7734612038166229L0.9573220348059658.7808637033611664C0.9547726308444411.796553631238311.950365016922748.8119298542011708.9441793314758266.8267114424757592L0.9762747746692458.8525850746599137C0.969007220350636.8675867245907916.9601769665506987.8818813679238033.9499142382262111.8952676716542589L0.9098951072781118.8822231658154869C0.8992967992573135.89462153317409.8872559994075976.9058774527851481.8739930884250485.9157849094810713L0.8879522020611378.9531907088873705C0.8736324654678191.9627844606690087.8583360416986707.9710391138613113.8422883201019612.977837614391784L0.8146105081346023.9478343145300284C0.7988032018427124.9536167857112502.7823547880713033.9577370890630518.7655707946035836.9601156278161371L0.7576471068489037.9990384480019633C0.7401168242058064 1.0006537942023856.7224563166059317 1.0006537942023856.7049210253106508.9990384480019633L0.6969973375559708.9601156278161371C0.6802133440882511.9577370890630517.6637649303168421.95361678571125.647957624024952.9478343145300284L0.6202798120575933.977837614391784C0.6042320904608837.9710391138613113.5889356666917354.9627844606690087.5746159300984167.9531907088873705L0.5885750437345059.9157849094810713C0.5753121327519569.9058774527851481.563271332902241.89462153317409.5526730248814425.8822231658154869L0.5126538939333434.8952676716542589C0.5023961742610396.8818813679238033.49356592046110226.8675867245907916.4862933574903087.8525850746599138L0.518388800683728.8267114424757593C0.5122031152368065.8119298542011709.5077955013151135.7965536312383112.5052460973535888.7808637033611665L0.46361418040232455.773461203816623C0.46188619539893355.757068951504512.46188619539893355.7405596451199069.46361418040232455.7241720749706959L0.5052460973535888.7167648932632524C0.5077955013151135.7010749653861078.5122031152368065.6856987424232481.518388800683728.6709218363115594L0.4862933574903087.645048204127405C0.48646365166455596.6446923597470222.48663394583880315.644341197529539.4868092486652341.6439900353120559L0.4478269087191694.6312826452020677C0.43722860069837116.6436810125606708.4251878008486552.6549369321717289.4119248898661061.6648397067047522L0.42588400350219535.7022501882739512C0.411559258256693.7118439400555895.3962678431397284.720098593247892.3802201215430187.7268970937783648L0.35254230957565996.6968937939166092C0.3367350032837699.702676265097831.32028658951236094.7067965684496326.3035025960446412.7091751072027179L0.2955789082899612.7480979273885441C0.27804361699468016.7497132735889663.2603831093948056.7497132735889663.24285282675170825.7480979273885441L0.23492913899702825.7091751072027179C0.21814514552930853.7067965684496325.2016967317578995.7026762650978308.1858894254660095.6968937939166092L0.15821161349865073.7268970937783648C0.14216389190194106.720098593247892.12686746813279273.7118439400555895.1125477315394741.7022501882739512L0.1265068451755633.6648397067047522C0.11324393419301426.6549369321717289.10120313434329828.6436810125606708.09060482632250003.6312826452020677L0.05058569537440074.6443271510408397C0.04032296704991321.6309408473103841.03149271324997591.6166415218144725.024225158931366137.6016445540464946L0.056320602124785436.5757662396994404C0.050129908025680216.5609893335877518.04572730275617092.545613110624892.0431778987946462.5299231827477474L0.001545981843381972.5225206832032038C-0.00018200316000904808.5061284308910928 -0.00018200316000904808.48961912450648765.001545981843381972.4732268721943768L0.0431778987946462.4658243726498331C0.04572730275617092.4501344447726885.050129908025680216.4347582218098287.056320602124785436.4199813156981401L0.02422515893136614.39410300135108595C0.03149271324997591.3791013514202082.04032296704991321.3648067080871963.05058569537440075.3514204043567407L0.09060482632250003.36446491019551275C0.10120313434329828.35206654283690964.11324393419301426.34081062322585154.1265068451755633.33090784869282824L0.1125477315394741.2934973671236292C0.12686746813279273.2839036153419911.14216389190194106.2756489621496885.15821161349865073.2688504616192157L0.1858894254660095.29885376148097137C0.2016967317578995.2930712902997497.21814514552930853.2889509869479481.23492913899702825.2865724481948626L0.24285282675170825.2476496280090364C0.2603831093948056.24603428180861417.27804361699468016.24603428180861417.2955789082899612.2476496280090364L0.3035025960446412.2865724481948626C0.32028658951236094.28895098694794813.33673500328377.2930712902997497.35254230957565996.29885376148097137L0.3802201215430187.2688504616192157C0.39626784313972835.2756489621496884.411559258256693.2839036153419911.42588400350219535.2934973671236292L0.4119248898661061.33090784869282824C0.42518780084865515.3408106232258515.43722860069837116.35206654283690964.4478269087191694.36446491019551275L0.4878460396672687.3514204043567407C0.4880914636242721.3517434735968252.4883418962334592.35207122499980936.48858732019046247.3523989764027936ZM0.731286570405869.6985278687686304C0.7609728518989083.6985278687686304.7850794948592591.7210631188052454.7850794948592591.7488142983122096C0.7850794948592591.7765701599820733.7609728518989085.7991007278557888.731286570405869.7991007278557888C0.701595280260646.7991007278557888.6774886373002953.7765701599820733.6774886373002953.7488142983122096C0.6774886373002953.7210631188052455.701595280260646.6985278687686304.731286570405869.6985278687686304ZM0.7042298313092943.5019800345618924L0.7034284469598956.501905119955496L0.6955047592052157.46298698193256965C0.678720765737496.46060376101658435.6622723519660869.45648345766478277.6464650456741969.4507009864835611L0.6187872337068382.4807042863453167C0.6027395121101286.473905785814844.5874480969931639.4656511326225414.5731233517476615.45606206300380303L0.5870824653837508.418651581434604C0.5738195544012017.408744124738681.5617787545514857.3974882051276229.5511804465306874.3850898377690197L0.5111613155825881.39813902577069155C0.5109158916255848.39781127436770736.5106654590163977.3974882051276229.5104200350593944.39716045372463865L0.48211113291688407.41998131569813996C0.48829681836380556.4347582218098286.4927044322854986.4501344447726883.4952538362470233.465824372649833L0.5368857531982875.47322687219437665C0.5386137382016786.48961912450648754.5386137382016786.5061284308910927.5368857531982875.5225206832032036L0.4952538362470233.5299231827477473C0.4927044322854986.5456131106248919.48829681836380556.5609893335877517.48211113291688407.5757662396994403L0.5142065761103034.6016445540464944C0.5140362819360561.6019957162639775.5138659877618089.6023468784814607.513690684935378.6026980406989437L0.5526730248814427.615405430808932C0.563271332902241.6030117456132287.5753121327519569.5917558260021705.588575043734506.5818483693062474L0.5746159300984167.5444378877370485C0.5889356666917354.5348441359554102.6042320904608837.5265894827631077.6202798120575934.519790982232635L0.6479576240249522.5497989642572905C0.6637649303168422.544011810913169.6802133440882512.5398915075613674.6969973375559709.5375129688082819L0.7042298313092945.5019800345618926ZM0.2692133631947428.447587348155211C0.2989046533399659.447587348155211.32300628764813283.47011791602892633.32300628764813283.4978737776987901C0.32300628764813283.5256296393686539.2989046533399659.5481602072423692.2692133631947428.5481602072423692C0.23952708170170345.5481602072423692.21542043874135278.5256296393686539.21542043874135278.4978737776987901C0.21542043874135278.47011791602892633.23952708170170345.447587348155211.2692133631947428.447587348155211ZM0.7297939920551139.20139454072216306C0.7594802735481532.20139454072216306.783586916508504.2239297907587782.783586916508504.2516809702657422C0.783586916508504.279436831935606.7594802735481533.30196739980932136.7297939920551139.30196739980932136C0.7001027019098908.30196739980932136.6760010676017238.27943683193560603.6760010676017238.2516809702657422C0.6760010676017238.2239297907587782.7001027019098908.20139454072216306.7297939920551139.20139454072216306Z ' var data3 = 'M10 10-45-30.5.5 .89L2e-2.5.5.5-.5C.5.5.5.5.5.5L-3-4z' var draw = SVG().addTo('body') var path = SVG.create('path') path.style.visibility = 'hidden' bench.test('using SVG.js v3.0.0', function () { for (var i = 0; i < 10000; i++) { SVG.parser.path.setAttribute('d', data) SVG.parser.path.getBBox() } }) bench.test('using SVG.js v3.0.0 more data', function () { for (var i = 0; i < 10000; i++) { SVG.parser.path.setAttribute('d', data2) SVG.parser.path.getBBox() } }) bench.test('using SVG.js v3.0.0 complicated data', function () { for (var i = 0; i < 10000; i++) { SVG.parser.path.setAttribute('d', data3) SVG.parser.path.getBBox() } }) bench.test('using SVG.js v3.0.0 without parser', function () { for (var i = 0; i < 10000; i++) { path.setAttribute('d', data) draw.node.appendChild(path) path.getBBox() } //new SVG.Path().attr('d', data).addTo(draw).bbox() }) bench.test('using SVG.js v3.0.0 more data without parser', function () { for (var i = 0; i < 10000; i++) { path.setAttribute('d', data2) draw.node.appendChild(path) path.getBBox() } //new SVG.Path().attr('d', data2).addTo(draw).bbox() }) bench.test( 'using SVG.js v3.0.0 complicated data without parser', function () { for (var i = 0; i < 10000; i++) { path.setAttribute('d', data3) draw.node.appendChild(path) path.getBBox() } //new SVG.Path().attr('d', data3).addTo(draw).bbox() } ) }) svg.js-3.2.4/bench/tests/10000-pathArrays.js000066400000000000000000000374521463723416200203100ustar00rootroot00000000000000SVG.bench.describe('Generate 10000 pathArrays', function (bench) { var data = 'M97.499,75.211l5.652,-4.874c-1.235,-3.156 -2.115,-6.44 -2.623,-9.791l-8.313,-1.582c-0.345,-3.501 -0.345,-7.027 0,-10.527l8.313,-1.582c0.508,-3.351 1.388,-6.635 2.623,-9.791l-6.408,-5.526c1.452,-3.204 3.215,-6.258 5.263,-9.117l7.99,2.787c2.116,-2.648 4.52,-5.052 7.168,-7.168l-2.787,-7.99c2.86,-2.049 5.913,-3.812 9.117,-5.263l5.526,6.408c3.156,-1.236 6.44,-2.115 9.791,-2.624l1.582,-8.312c3.501,-0.345 7.027,-0.345 10.527,0l1.582,8.312c3.351,0.509 6.635,1.388 9.791,2.624l5.526,-6.408c3.204,1.451 6.258,3.214 9.117,5.263l-2.787,7.99c2.648,2.116 5.052,4.52 7.168,7.168l7.99,-2.787c2.049,2.859 3.812,5.913 5.263,9.117l-6.408,5.526c1.236,3.156 2.115,6.44 2.624,9.791l8.312,1.582c0.345,3.5 0.345,7.026 0,10.527l-8.312,1.582c-0.509,3.351 -1.388,6.635 -2.624,9.791l6.408,5.526c-1.451,3.204 -3.214,6.257 -5.263,9.117l-7.99,-2.787c-2.116,2.648 -4.52,5.052 -7.168,7.168l2.787,7.99c-2.859,2.048 -5.913,3.811 -9.117,5.263l-5.526,-6.408c-3.156,1.235 -6.44,2.115 -9.791,2.624l-1.444,7.589l0.16,0.015l1.582,8.313c3.351,0.508 6.635,1.388 9.791,2.624l5.526,-6.409c3.204,1.452 6.258,3.215 9.117,5.264l-2.787,7.99c2.648,2.116 5.052,4.52 7.168,7.167l7.99,-2.786c2.049,2.859 3.812,5.913 5.263,9.117l-6.408,5.526c1.235,3.156 2.115,6.44 2.624,9.791l8.312,1.582c0.345,3.5 0.345,7.026 0,10.527l-8.312,1.581c-0.509,3.351 -1.389,6.635 -2.624,9.792l6.408,5.526c-1.451,3.204 -3.214,6.257 -5.263,9.116l-7.99,-2.786c-2.116,2.648 -4.52,5.052 -7.168,7.168l2.787,7.989c-2.859,2.049 -5.913,3.812 -9.117,5.264l-5.526,-6.408c-3.156,1.235 -6.44,2.115 -9.791,2.623l-1.582,8.313c-3.5,0.345 -7.026,0.345 -10.527,0l-1.582,-8.313c-3.351,-0.508 -6.635,-1.388 -9.791,-2.623l-5.526,6.408c-3.204,-1.452 -6.258,-3.215 -9.117,-5.264l2.787,-7.989c-2.648,-2.116 -5.052,-4.52 -7.168,-7.168l-7.99,2.786c-2.048,-2.859 -3.811,-5.912 -5.263,-9.116l6.408,-5.526c-1.235,-3.157 -2.115,-6.441 -2.624,-9.792l-8.312,-1.581c-0.345,-3.501 -0.345,-7.027 0,-10.527l8.312,-1.582c0.509,-3.351 1.389,-6.635 2.624,-9.791l-6.408,-5.526c0.034,-0.076 0.068,-0.151 0.103,-0.226l-7.783,-2.714c-2.116,2.648 -4.52,5.052 -7.168,7.167l2.787,7.99c-2.86,2.049 -5.913,3.812 -9.117,5.264l-5.526,-6.408c-3.156,1.235 -6.44,2.115 -9.791,2.623l-1.582,8.313c-3.501,0.345 -7.027,0.345 -10.527,0l-1.582,-8.313c-3.351,-0.508 -6.635,-1.388 -9.791,-2.623l-5.526,6.408c-3.204,-1.452 -6.258,-3.215 -9.117,-5.264l2.787,-7.99c-2.648,-2.115 -5.052,-4.519 -7.168,-7.167l-7.99,2.786c-2.049,-2.859 -3.812,-5.913 -5.263,-9.116l6.408,-5.527c-1.236,-3.156 -2.115,-6.44 -2.624,-9.791l-8.312,-1.581c-0.345,-3.501 -0.345,-7.027 0,-10.528l8.312,-1.581c0.509,-3.351 1.388,-6.635 2.624,-9.791l-6.408,-5.527c1.451,-3.204 3.214,-6.257 5.263,-9.116l7.99,2.786c2.116,-2.648 4.52,-5.052 7.168,-7.167l-2.787,-7.99c2.859,-2.049 5.913,-3.812 9.117,-5.264l5.526,6.408c3.156,-1.235 6.44,-2.115 9.791,-2.623l1.582,-8.313c3.5,-0.345 7.026,-0.345 10.527,0l1.582,8.313c3.351,0.508 6.635,1.388 9.791,2.623l5.526,-6.408c3.204,1.452 6.257,3.215 9.117,5.264l-2.787,7.99c2.648,2.115 5.052,4.519 7.168,7.167l7.99,-2.786c0.049,0.069 0.099,0.139 0.148,0.209Zm48.456,73.925c5.927,0 10.74,4.813 10.74,10.74c0,5.928 -4.813,10.74 -10.74,10.74c-5.928,0 -10.741,-4.812 -10.741,-10.74c0,-5.927 4.813,-10.74 10.741,-10.74Zm-5.402,-41.978l-0.16,-0.016l-1.582,-8.312c-3.351,-0.509 -6.635,-1.389 -9.791,-2.624l-5.526,6.408c-3.204,-1.452 -6.257,-3.215 -9.117,-5.263l2.787,-7.99c-2.648,-2.116 -5.052,-4.52 -7.168,-7.168l-7.99,2.787c-0.049,-0.07 -0.099,-0.139 -0.148,-0.209l-5.652,4.874c1.235,3.156 2.115,6.44 2.624,9.791l8.312,1.581c0.345,3.501 0.345,7.027 0,10.528l-8.312,1.581c-0.509,3.351 -1.389,6.635 -2.624,9.791l6.408,5.527c-0.034,0.075 -0.068,0.15 -0.103,0.225l7.783,2.714c2.116,-2.647 4.52,-5.051 7.168,-7.167l-2.787,-7.99c2.859,-2.049 5.913,-3.812 9.117,-5.264l5.526,6.409c3.156,-1.236 6.44,-2.116 9.791,-2.624l1.444,-7.589Zm-86.853,-11.617c5.928,0 10.74,4.812 10.74,10.74c0,5.928 -4.812,10.74 -10.74,10.74c-5.927,0 -10.74,-4.812 -10.74,-10.74c0,-5.928 4.813,-10.74 10.74,-10.74Zm91.957,-52.581c5.927,0 10.74,4.813 10.74,10.74c0,5.928 -4.813,10.74 -10.74,10.74c-5.928,0 -10.74,-4.812 -10.74,-10.74c0,-5.927 4.812,-10.74 10.74,-10.74Z' var data2 = 'M0.48858732019046247.35239897640279355L0.5168962223329727.32957811442929225C0.5107105368860513.31480120831760355.5063029229643583.2994249853547438.5037585276550173.2837350574775992L0.46212160205156927.2763278757701558C0.46039361704817827.25993562345804494.46039361704817827.2434263170734397.46212160205156927.22703874692422862L0.5037585276550173.2196315652167852C0.5063029229643582.20394163733964055.5107105368860513.1885654143767808.5168962223329727.17378850826509218L0.4848007791395535.14791487608093778C0.492073342110347.13291322615006.5009035959102843.11861390065414837.5111613155825881.1052275969236928L0.5511804465306873.11827678492536459C0.5617787545514856.10587841756676146.5738195544012016.09462249795570335.5870824653837506.0847150412597803L0.5731233517476615.047304559690581297C0.5874480969931638.037710807908943156.6027395121101284.02945615471664055.6187872337068381.022662336349067613L0.6464650456741969.052665636210823215C0.6622723519660869.046878482866701814.678720765737496.04276286167779995.6955047592052157.040379640761814675L0.7034284469598956.0014615027388882582C0.7209637382551767 -0.0001538434615339766.7386242458550512 -0.0001538434615339766.7561545284981485.0014615027388882582L0.7640782162528285.040379640761814675C0.7808622097205482.04276286167779995.7973106234919571.046878482866701814.8131179297838472.052665636210823215L0.8407957417512061.022662336349067617C0.8568434633479157.02945615471664055.872139887117064.037710807908943156.8864596237103826.04730455969058131L0.8725005100742934.0847150412597803C0.8857634210568424.09462249795570335.8978042209065583.10587841756676146.9084025289273567.11827678492536459L0.948421659875456.1052275969236928C0.9586843881999436.11861390065414837.9675146419998809.13291322615006.9747821963184906.14791487608093778L0.9426867531250714.17378850826509218C0.9488774472241766.1885654143767808.953280052493686.20394163733964055.9558294564552107.2196315652167852L0.9974613734064749.22703874692422862C0.9991893584098659.2434263170734397.9991893584098659.25993562345804494.9974613734064749.2763278757701558L0.9558294564552107.2837350574775992C0.953280052493686.2994249853547438.9488774472241766.31480120831760366.9426867531250714.32957811442929225L0.9747821963184906.3554517466134466C0.9675146419998809.37045339654432435.9586843881999436.38474803987733625.948421659875456.3981390257706916L0.9084025289273567.3850898377690198C0.8978042209065583.3974882051276229.8857634210568424.40874412473868105.8725005100742934.41865158143460407L0.8864596237103826.4560620630038031C0.8721398871170639.46565113262254143.8568434633479156.4739057858148441.8407957417512061.4807042863453168L0.8131179297838472.45070098648356116C0.7973106234919571.4564834576647828.7808622097205482.4606037610165844.7640782162528285.4629869819325697L0.756845722499505.4985199161789591L0.7576471068489037.4985901486224557L0.7655707946035836.5375129688082819C0.7823547880713033.5398915075613674.7988032018427124.5440118109131691.8146105081346023.5497989642572905L0.8422883201019612.519790982232635C0.8583360416986708.5265894827631077.8736324654678193.5348441359554104.8879522020611378.5444378877370485L0.8739930884250485.5818483693062474C0.8872559994075976.5917558260021705.8992967992573135.6030117456132287.9098951072781118.615405430808932L0.9499142382262111.6023609249701599C0.9601769665506987.6157472287006156.969007220350636.6300465541965272.9762747746692458.6450482041274048L0.9441793314758266.6709218363115593C0.9503650169227481.685698742423248.9547726308444411.7010749653861077.9573220348059658.7167648932632523L0.9989539517572301.7241720749706957C1.000681936760621.7405596451199068 1.000681936760621.757068951504512.9989539517572301.7734612038166229L0.9573220348059658.7808637033611664C0.9547726308444411.796553631238311.950365016922748.8119298542011708.9441793314758266.8267114424757592L0.9762747746692458.8525850746599137C0.969007220350636.8675867245907916.9601769665506987.8818813679238033.9499142382262111.8952676716542589L0.9098951072781118.8822231658154869C0.8992967992573135.89462153317409.8872559994075976.9058774527851481.8739930884250485.9157849094810713L0.8879522020611378.9531907088873705C0.8736324654678191.9627844606690087.8583360416986707.9710391138613113.8422883201019612.977837614391784L0.8146105081346023.9478343145300284C0.7988032018427124.9536167857112502.7823547880713033.9577370890630518.7655707946035836.9601156278161371L0.7576471068489037.9990384480019633C0.7401168242058064 1.0006537942023856.7224563166059317 1.0006537942023856.7049210253106508.9990384480019633L0.6969973375559708.9601156278161371C0.6802133440882511.9577370890630517.6637649303168421.95361678571125.647957624024952.9478343145300284L0.6202798120575933.977837614391784C0.6042320904608837.9710391138613113.5889356666917354.9627844606690087.5746159300984167.9531907088873705L0.5885750437345059.9157849094810713C0.5753121327519569.9058774527851481.563271332902241.89462153317409.5526730248814425.8822231658154869L0.5126538939333434.8952676716542589C0.5023961742610396.8818813679238033.49356592046110226.8675867245907916.4862933574903087.8525850746599138L0.518388800683728.8267114424757593C0.5122031152368065.8119298542011709.5077955013151135.7965536312383112.5052460973535888.7808637033611665L0.46361418040232455.773461203816623C0.46188619539893355.757068951504512.46188619539893355.7405596451199069.46361418040232455.7241720749706959L0.5052460973535888.7167648932632524C0.5077955013151135.7010749653861078.5122031152368065.6856987424232481.518388800683728.6709218363115594L0.4862933574903087.645048204127405C0.48646365166455596.6446923597470222.48663394583880315.644341197529539.4868092486652341.6439900353120559L0.4478269087191694.6312826452020677C0.43722860069837116.6436810125606708.4251878008486552.6549369321717289.4119248898661061.6648397067047522L0.42588400350219535.7022501882739512C0.411559258256693.7118439400555895.3962678431397284.720098593247892.3802201215430187.7268970937783648L0.35254230957565996.6968937939166092C0.3367350032837699.702676265097831.32028658951236094.7067965684496326.3035025960446412.7091751072027179L0.2955789082899612.7480979273885441C0.27804361699468016.7497132735889663.2603831093948056.7497132735889663.24285282675170825.7480979273885441L0.23492913899702825.7091751072027179C0.21814514552930853.7067965684496325.2016967317578995.7026762650978308.1858894254660095.6968937939166092L0.15821161349865073.7268970937783648C0.14216389190194106.720098593247892.12686746813279273.7118439400555895.1125477315394741.7022501882739512L0.1265068451755633.6648397067047522C0.11324393419301426.6549369321717289.10120313434329828.6436810125606708.09060482632250003.6312826452020677L0.05058569537440074.6443271510408397C0.04032296704991321.6309408473103841.03149271324997591.6166415218144725.024225158931366137.6016445540464946L0.056320602124785436.5757662396994404C0.050129908025680216.5609893335877518.04572730275617092.545613110624892.0431778987946462.5299231827477474L0.001545981843381972.5225206832032038C-0.00018200316000904808.5061284308910928 -0.00018200316000904808.48961912450648765.001545981843381972.4732268721943768L0.0431778987946462.4658243726498331C0.04572730275617092.4501344447726885.050129908025680216.4347582218098287.056320602124785436.4199813156981401L0.02422515893136614.39410300135108595C0.03149271324997591.3791013514202082.04032296704991321.3648067080871963.05058569537440075.3514204043567407L0.09060482632250003.36446491019551275C0.10120313434329828.35206654283690964.11324393419301426.34081062322585154.1265068451755633.33090784869282824L0.1125477315394741.2934973671236292C0.12686746813279273.2839036153419911.14216389190194106.2756489621496885.15821161349865073.2688504616192157L0.1858894254660095.29885376148097137C0.2016967317578995.2930712902997497.21814514552930853.2889509869479481.23492913899702825.2865724481948626L0.24285282675170825.2476496280090364C0.2603831093948056.24603428180861417.27804361699468016.24603428180861417.2955789082899612.2476496280090364L0.3035025960446412.2865724481948626C0.32028658951236094.28895098694794813.33673500328377.2930712902997497.35254230957565996.29885376148097137L0.3802201215430187.2688504616192157C0.39626784313972835.2756489621496884.411559258256693.2839036153419911.42588400350219535.2934973671236292L0.4119248898661061.33090784869282824C0.42518780084865515.3408106232258515.43722860069837116.35206654283690964.4478269087191694.36446491019551275L0.4878460396672687.3514204043567407C0.4880914636242721.3517434735968252.4883418962334592.35207122499980936.48858732019046247.3523989764027936ZM0.731286570405869.6985278687686304C0.7609728518989083.6985278687686304.7850794948592591.7210631188052454.7850794948592591.7488142983122096C0.7850794948592591.7765701599820733.7609728518989085.7991007278557888.731286570405869.7991007278557888C0.701595280260646.7991007278557888.6774886373002953.7765701599820733.6774886373002953.7488142983122096C0.6774886373002953.7210631188052455.701595280260646.6985278687686304.731286570405869.6985278687686304ZM0.7042298313092943.5019800345618924L0.7034284469598956.501905119955496L0.6955047592052157.46298698193256965C0.678720765737496.46060376101658435.6622723519660869.45648345766478277.6464650456741969.4507009864835611L0.6187872337068382.4807042863453167C0.6027395121101286.473905785814844.5874480969931639.4656511326225414.5731233517476615.45606206300380303L0.5870824653837508.418651581434604C0.5738195544012017.408744124738681.5617787545514857.3974882051276229.5511804465306874.3850898377690197L0.5111613155825881.39813902577069155C0.5109158916255848.39781127436770736.5106654590163977.3974882051276229.5104200350593944.39716045372463865L0.48211113291688407.41998131569813996C0.48829681836380556.4347582218098286.4927044322854986.4501344447726883.4952538362470233.465824372649833L0.5368857531982875.47322687219437665C0.5386137382016786.48961912450648754.5386137382016786.5061284308910927.5368857531982875.5225206832032036L0.4952538362470233.5299231827477473C0.4927044322854986.5456131106248919.48829681836380556.5609893335877517.48211113291688407.5757662396994403L0.5142065761103034.6016445540464944C0.5140362819360561.6019957162639775.5138659877618089.6023468784814607.513690684935378.6026980406989437L0.5526730248814427.615405430808932C0.563271332902241.6030117456132287.5753121327519569.5917558260021705.588575043734506.5818483693062474L0.5746159300984167.5444378877370485C0.5889356666917354.5348441359554102.6042320904608837.5265894827631077.6202798120575934.519790982232635L0.6479576240249522.5497989642572905C0.6637649303168422.544011810913169.6802133440882512.5398915075613674.6969973375559709.5375129688082819L0.7042298313092945.5019800345618926ZM0.2692133631947428.447587348155211C0.2989046533399659.447587348155211.32300628764813283.47011791602892633.32300628764813283.4978737776987901C0.32300628764813283.5256296393686539.2989046533399659.5481602072423692.2692133631947428.5481602072423692C0.23952708170170345.5481602072423692.21542043874135278.5256296393686539.21542043874135278.4978737776987901C0.21542043874135278.47011791602892633.23952708170170345.447587348155211.2692133631947428.447587348155211ZM0.7297939920551139.20139454072216306C0.7594802735481532.20139454072216306.783586916508504.2239297907587782.783586916508504.2516809702657422C0.783586916508504.279436831935606.7594802735481533.30196739980932136.7297939920551139.30196739980932136C0.7001027019098908.30196739980932136.6760010676017238.27943683193560603.6760010676017238.2516809702657422C0.6760010676017238.2239297907587782.7001027019098908.20139454072216306.7297939920551139.20139454072216306Z ' var data3 = 'M10 10-45-30.5.5 .89L2e-2.5.5.5-.5C.5.5.5.5.5.5L-3-4z' bench.test('using SVG.js v2.5.3', function () { for (var i = 0; i < 10000; i++) new SVG.PathArray(data) }) bench.test('using SVG.js v2.5.3 more data', function () { for (var i = 0; i < 10000; i++) new SVG.PathArray(data2) }) bench.test('using SVG.js v2.5.3 complicated data', function () { for (var i = 0; i < 10000; i++) new SVG.PathArray(data3) }) }) svg.js-3.2.4/bench/tests/10000-paths.js000066400000000000000000000011671463723416200173030ustar00rootroot00000000000000SVG.bench.describe('Generate 10000 paths', function (bench) { var data = 'M 100 200 C 200 100 300 0 400 100 C 500 200 600 300 700 200 C 800 100 900 100 900 100' bench.test('using SVG.js v2.5.3', function () { for (var i = 0; i < 10000; i++) bench.draw.path(data) }) bench.test('using vanilla js', function () { for (var i = 0; i < 10000; i++) { var path = document.createElementNS(SVG.ns, 'path') path.setAttributeNS(null, 'd', data) bench.raw.appendChild(path) } }) bench.test('using Snap.svg v0.5.1', function () { for (var i = 0; i < 10000; i++) bench.snap.path(data) }) }) svg.js-3.2.4/bench/tests/10000-pointArray-bbox.js000066400000000000000000000024701463723416200212420ustar00rootroot00000000000000SVG.bench.describe('Generate 10000 pathArrays bbox', function (bench) { var data = '209,153 389,107 547,188 482,289 374,287 91,254 407,243 391,185 166,226 71,177 65,52 234,50 107,136 163,199 158,131 323,45 218,145 305,190 374,143 174,216 296,241' var dataArr = [ [209, 153], [389, 107], [547, 188], [482, 289], [374, 287], [91, 254], [407, 243], [391, 185], [166, 226], [71, 177], [65, 52], [234, 50], [107, 136], [163, 199], [158, 131], [323, 45], [218, 145], [305, 190], [374, 143], [174, 216], [296, 241] ] bench.test('using SVG.js v3.0.0', function () { for (var i = 0; i < 10000; i++) { SVG.parser.poly.setAttribute('points', data) SVG.parser.poly.getBBox() } }) bench.test('using SVG.js v3.0.0 without parser', function () { for (var i = 0; i < 10000; i++) { var maxX = -Infinity, maxY = -Infinity, minX = Infinity, minY = Infinity dataArr.forEach(function (el) { maxX = Math.max(el[0], maxX) maxY = Math.max(el[1], maxY) minX = Math.min(el[0], minX) minY = Math.min(el[1], minY) }) var a = { x: minX, y: minY, width: maxX - minX, height: maxY - minY } } //new SVG.Path().attr('d', data).addTo(draw).bbox() }) }) svg.js-3.2.4/bench/tests/10000-rects.js000066400000000000000000000072111463723416200173000ustar00rootroot00000000000000SVG.bench.describe('Generate 10000 rects', function (bench) { bench.test('using SVG.js v3.0.6', function () { for (var i = 0; i < 10000; i++) bench.draw.rect(100, 100) }) bench.test('using vanilla js', function () { for (var i = 0; i < 10000; i++) { var rect = document.createElementNS(SVG.ns, 'rect') rect.setAttributeNS(null, 'height', 100) rect.setAttributeNS(null, 'width', 100) bench.raw.appendChild(rect) } }) bench.test('using Snap.svg v0.5.1', function () { for (var i = 0; i < 10000; i++) bench.snap.rect(50, 50, 100, 100) }) }) SVG.bench.describe('Generate 10000 rects with fill', function (bench) { bench.test('using SVG.js v3.0.6', function () { for (var i = 0; i < 10000; i++) bench.draw.rect(100, 100).fill('#f06') }) bench.test('using vanilla js', function () { for (var i = 0; i < 10000; i++) { var rect = document.createElementNS(SVG.ns, 'rect') rect.setAttributeNS(null, 'height', 100) rect.setAttributeNS(null, 'width', 100) rect.setAttributeNS(null, 'fill', '#f06') bench.raw.appendChild(rect) } }) bench.test('using Snap.svg v0.5.1', function () { for (var i = 0; i < 10000; i++) bench.snap.rect(50, 50, 100, 100).attr('fill', '#f06') }) }) SVG.bench.describe( 'Generate 10000 rects with position and fill', function (bench) { bench.test('using SVG.js v3.0.6', function () { for (var i = 0; i < 10000; i++) bench.draw.rect(100, 100).move(50, 50).fill('#f06') }) bench.test('using vanilla js', function () { for (var i = 0; i < 10000; i++) { var rect = document.createElementNS(SVG.ns, 'rect') rect.setAttributeNS(null, 'height', 100) rect.setAttributeNS(null, 'width', 100) rect.setAttributeNS(null, 'fill', '#f06') rect.setAttributeNS(null, 'x', 50) rect.setAttributeNS(null, 'y', 50) bench.raw.appendChild(rect) } }) bench.test('using Snap.svg v0.5.1', function () { for (var i = 0; i < 10000; i++) bench.snap.rect(50, 50, 100, 100).attr('fill', '#f06') }) } ) SVG.bench.describe('Generate 10000 rects with gradient fill', function (bench) { bench.test('using SVG.js v3.0.6', function () { for (var i = 0; i < 10000; i++) { var g = bench.draw.gradient('linear', function (add) { add.stop(0, '#000') add.stop(0.25, '#f00') add.stop(1, '#fff') }) bench.draw.rect(100, 100).fill(g) } }) bench.test('using vanilla js', function () { for (var i = 0; i < 10000; i++) { var g = document.createElementNS(SVG.ns, 'linearGradient') var stop = document.createElementNS(SVG.ns, 'stop') stop.setAttributeNS(null, 'offset', '0%') stop.setAttributeNS(null, 'color', '#000') g.appendChild(stop) stop = document.createElementNS(SVG.ns, 'stop') stop.setAttributeNS(null, 'offset', '25%') stop.setAttributeNS(null, 'color', '#f00') g.appendChild(stop) stop = document.createElementNS(SVG.ns, 'stop') stop.setAttributeNS(null, 'offset', '100%') stop.setAttributeNS(null, 'color', '#fff') g.appendChild(stop) bench.raw.appendChild(g) var rect = document.createElementNS(SVG.ns, 'rect') rect.setAttributeNS(null, 'height', 100) rect.setAttributeNS(null, 'width', 100) rect.setAttributeNS(null, 'fill', '#f06') bench.raw.appendChild(rect) } }) bench.test('using Snap.svg v0.5.1', function () { for (var i = 0; i < 10000; i++) { var g = bench.snap.gradient('L(0, 0, 100, 100)#000-#f00:25%-#fff') bench.snap.rect(50, 50, 100, 100).attr({ fill: g }) } }) }) svg.js-3.2.4/bench/tests/10000-textContent.js000066400000000000000000000011331463723416200204740ustar00rootroot00000000000000SVG.bench.describe('Change textContent 10000 times', function (bench) { var data = 'M 100 200 C 200 100 300 0 400 100 C 500 200 600 300 700 200 C 800 100 900 100 900 100' var node = bench.draw.plain('').node bench.test('using appendChild', function () { for (var i = 0; i < 1000000; i++) { while (node.hasChildNodes()) { node.removeChild(node.lastChild) } node.appendChild(document.createTextNode('test' + i)) } }) bench.test('using textContent', function () { for (var i = 0; i < 1000000; i++) { node.textContent = 'test' + i } }) }) svg.js-3.2.4/bench/tests/10000-transform.js000066400000000000000000000013611463723416200201730ustar00rootroot00000000000000SVG.bench.describe('Transform 1000000 rects', function (bench) { let parameters = { translate: [20, 30], origin: [100, 100], rotate: 25, skew: [10, 30], scale: 0.5 } let matrixLike = { a: 2, b: 3, c: 1, d: 2, e: 49, f: 100 } let matrix = new SVG.Matrix(matrixLike) let worker = new SVG.Matrix() bench.test('with parameters', function () { for (var i = 0; i < 1000000; i++) worker.transform(parameters) }) worker = new SVG.Matrix() bench.test('with matrix like', function () { for (var i = 0; i < 1000000; i++) { worker.transform(matrixLike) } }) worker = new SVG.Matrix() bench.test('with SVG.Matrix', function () { for (var i = 0; i < 1000000; i++) worker.transform(matrix) }) }) svg.js-3.2.4/package-lock.json000066400000000000000000017415071463723416200161750ustar00rootroot00000000000000{ "name": "@svgdotjs/svg.js", "version": "3.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@svgdotjs/svg.js", "version": "3.2.0", "license": "MIT", "devDependencies": { "@babel/core": "^7.24.7", "@babel/eslint-parser": "^7.24.7", "@babel/plugin-transform-runtime": "^7.24.7", "@babel/preset-env": "^7.24.7", "@rollup/plugin-babel": "^6.0.4", "@rollup/plugin-commonjs": "^26.0.1", "@rollup/plugin-node-resolve": "^15.2.3", "@rollup/plugin-terser": "^0.4.4", "@target/custom-event-polyfill": "github:Adobe-Marketing-Cloud/custom-event-polyfill", "@types/jasmine": "^5.1.4", "babel-plugin-polyfill-corejs3": "^0.10.4", "core-js": "^3.37.1", "coveralls": "^3.1.1", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-config-standard": "^17.1.0", "http-server": "^14.1.1", "jasmine": "^5.1.0", "jasmine-core": "^5.1.2", "karma": "^6.4.3", "karma-chrome-launcher": "^3.2.0", "karma-coverage": "^2.2.1", "karma-firefox-launcher": "^2.1.3", "karma-jasmine": "^5.1.0", "karma-sauce-launcher": "^4.3.6", "prettier": "^3.3.2", "rollup": "^4.18.0", "rollup-plugin-filesize": "^10.0.0", "svgdom": "^0.1.19", "typescript": "^5.4.5", "yargs": "^17.7.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/Fuzzyma" } }, "node_modules/@ampproject/remapping": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@babel/code-frame": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dev": true, "dependencies": { "@babel/highlight": "^7.24.7", "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz", "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.7", "@babel/generator": "^7.24.7", "@babel/helper-compilation-targets": "^7.24.7", "@babel/helper-module-transforms": "^7.24.7", "@babel/helpers": "^7.24.7", "@babel/parser": "^7.24.7", "@babel/template": "^7.24.7", "@babel/traverse": "^7.24.7", "@babel/types": "^7.24.7", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/babel" } }, "node_modules/@babel/eslint-parser": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.7.tgz", "integrity": "sha512-SO5E3bVxDuxyNxM5agFv480YA2HO6ohZbGxbazZdIk3KQOPOGVNw6q78I9/lbviIf95eq6tPozeYnJLbjnC8IA==", "dev": true, "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", "semver": "^6.3.1" }, "engines": { "node": "^10.13.0 || ^12.13.0 || >=14.0.0" }, "peerDependencies": { "@babel/core": "^7.11.0", "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" } }, "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true, "engines": { "node": ">=10" } }, "node_modules/@babel/generator": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", "dev": true, "dependencies": { "@babel/types": "^7.24.7", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-annotate-as-pure": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", "dev": true, "dependencies": { "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", "dev": true, "dependencies": { "@babel/traverse": "^7.24.7", "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", "dev": true, "dependencies": { "@babel/compat-data": "^7.24.7", "@babel/helper-validator-option": "^7.24.7", "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "dependencies": { "yallist": "^3.0.2" } }, "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, "node_modules/@babel/helper-create-class-features-plugin": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz", "integrity": "sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", "@babel/helper-environment-visitor": "^7.24.7", "@babel/helper-function-name": "^7.24.7", "@babel/helper-member-expression-to-functions": "^7.24.7", "@babel/helper-optimise-call-expression": "^7.24.7", "@babel/helper-replace-supers": "^7.24.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", "@babel/helper-split-export-declaration": "^7.24.7", "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-create-regexp-features-plugin": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz", "integrity": "sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", "regexpu-core": "^5.3.1", "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-define-polyfill-provider": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-plugin-utils": "^7.22.5", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", "resolve": "^1.14.2" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/@babel/helper-environment-visitor": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", "dev": true, "dependencies": { "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", "dev": true, "dependencies": { "@babel/template": "^7.24.7", "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", "dev": true, "dependencies": { "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz", "integrity": "sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==", "dev": true, "dependencies": { "@babel/traverse": "^7.24.7", "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", "dev": true, "dependencies": { "@babel/traverse": "^7.24.7", "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.24.7", "@babel/helper-module-imports": "^7.24.7", "@babel/helper-simple-access": "^7.24.7", "@babel/helper-split-export-declaration": "^7.24.7", "@babel/helper-validator-identifier": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-optimise-call-expression": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", "dev": true, "dependencies": { "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz", "integrity": "sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", "@babel/helper-environment-visitor": "^7.24.7", "@babel/helper-wrap-function": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-replace-supers": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz", "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.24.7", "@babel/helper-member-expression-to-functions": "^7.24.7", "@babel/helper-optimise-call-expression": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-simple-access": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", "dev": true, "dependencies": { "@babel/traverse": "^7.24.7", "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", "dev": true, "dependencies": { "@babel/traverse": "^7.24.7", "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", "dev": true, "dependencies": { "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz", "integrity": "sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==", "dev": true, "dependencies": { "@babel/helper-function-name": "^7.24.7", "@babel/template": "^7.24.7", "@babel/traverse": "^7.24.7", "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz", "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==", "dev": true, "dependencies": { "@babel/template": "^7.24.7", "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz", "integrity": "sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz", "integrity": "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", "@babel/plugin-transform-optional-chaining": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.13.0" } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz", "integrity": "sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/plugin-proposal-private-property-in-object": { "version": "7.21.0-placeholder-for-preset-env.2", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-class-static-block": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-export-namespace-from": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.3" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-import-assertions": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-import-attributes": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-unicode-sets-regex": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/plugin-transform-arrow-functions": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-async-generator-functions": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz", "integrity": "sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7", "@babel/helper-remap-async-to-generator": "^7.24.7", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-async-to-generator": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7", "@babel/helper-remap-async-to-generator": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-block-scoping": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz", "integrity": "sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-class-properties": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz", "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==", "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-class-static-block": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.12.0" } }, "node_modules/@babel/plugin-transform-classes": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz", "integrity": "sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", "@babel/helper-compilation-targets": "^7.24.7", "@babel/helper-environment-visitor": "^7.24.7", "@babel/helper-function-name": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7", "@babel/helper-replace-supers": "^7.24.7", "@babel/helper-split-export-declaration": "^7.24.7", "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-computed-properties": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/template": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-destructuring": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz", "integrity": "sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-dotall-regex": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-duplicate-keys": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-dynamic-import": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", "dev": true, "dependencies": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-export-namespace-from": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-for-of": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-function-name": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz", "integrity": "sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.24.7", "@babel/helper-function-name": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-json-strings": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-literals": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz", "integrity": "sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-member-expression-literals": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-amd": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-commonjs": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz", "integrity": "sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==", "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7", "@babel/helper-simple-access": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-systemjs": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz", "integrity": "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.24.7", "@babel/helper-module-transforms": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7", "@babel/helper-validator-identifier": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-umd": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/plugin-transform-new-target": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-numeric-separator": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-object-rest-spread": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-transform-parameters": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-object-super": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/helper-replace-supers": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-optional-chaining": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz", "integrity": "sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-parameters": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-private-methods": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz", "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==", "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-private-property-in-object": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", "@babel/helper-create-class-features-plugin": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-property-literals": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-regenerator": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "regenerator-transform": "^0.15.2" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-reserved-words": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-runtime": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.7.tgz", "integrity": "sha512-YqXjrk4C+a1kZjewqt+Mmu2UuV1s07y8kqcUf4qYLnoqemhR4gRQikhdAhSVJioMjVTu6Mo6pAbaypEA3jY6fw==", "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.10.1", "babel-plugin-polyfill-regenerator": "^0.6.1", "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-shorthand-properties": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-spread": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-sticky-regex": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-template-literals": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-typeof-symbol": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz", "integrity": "sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-unicode-escapes": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-unicode-regex": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz", "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/preset-env": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.7.tgz", "integrity": "sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ==", "dev": true, "dependencies": { "@babel/compat-data": "^7.24.7", "@babel/helper-compilation-targets": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7", "@babel/helper-validator-option": "^7.24.7", "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.7", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.7", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.7", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-import-assertions": "^7.24.7", "@babel/plugin-syntax-import-attributes": "^7.24.7", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.24.7", "@babel/plugin-transform-async-generator-functions": "^7.24.7", "@babel/plugin-transform-async-to-generator": "^7.24.7", "@babel/plugin-transform-block-scoped-functions": "^7.24.7", "@babel/plugin-transform-block-scoping": "^7.24.7", "@babel/plugin-transform-class-properties": "^7.24.7", "@babel/plugin-transform-class-static-block": "^7.24.7", "@babel/plugin-transform-classes": "^7.24.7", "@babel/plugin-transform-computed-properties": "^7.24.7", "@babel/plugin-transform-destructuring": "^7.24.7", "@babel/plugin-transform-dotall-regex": "^7.24.7", "@babel/plugin-transform-duplicate-keys": "^7.24.7", "@babel/plugin-transform-dynamic-import": "^7.24.7", "@babel/plugin-transform-exponentiation-operator": "^7.24.7", "@babel/plugin-transform-export-namespace-from": "^7.24.7", "@babel/plugin-transform-for-of": "^7.24.7", "@babel/plugin-transform-function-name": "^7.24.7", "@babel/plugin-transform-json-strings": "^7.24.7", "@babel/plugin-transform-literals": "^7.24.7", "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", "@babel/plugin-transform-member-expression-literals": "^7.24.7", "@babel/plugin-transform-modules-amd": "^7.24.7", "@babel/plugin-transform-modules-commonjs": "^7.24.7", "@babel/plugin-transform-modules-systemjs": "^7.24.7", "@babel/plugin-transform-modules-umd": "^7.24.7", "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", "@babel/plugin-transform-new-target": "^7.24.7", "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", "@babel/plugin-transform-numeric-separator": "^7.24.7", "@babel/plugin-transform-object-rest-spread": "^7.24.7", "@babel/plugin-transform-object-super": "^7.24.7", "@babel/plugin-transform-optional-catch-binding": "^7.24.7", "@babel/plugin-transform-optional-chaining": "^7.24.7", "@babel/plugin-transform-parameters": "^7.24.7", "@babel/plugin-transform-private-methods": "^7.24.7", "@babel/plugin-transform-private-property-in-object": "^7.24.7", "@babel/plugin-transform-property-literals": "^7.24.7", "@babel/plugin-transform-regenerator": "^7.24.7", "@babel/plugin-transform-reserved-words": "^7.24.7", "@babel/plugin-transform-shorthand-properties": "^7.24.7", "@babel/plugin-transform-spread": "^7.24.7", "@babel/plugin-transform-sticky-regex": "^7.24.7", "@babel/plugin-transform-template-literals": "^7.24.7", "@babel/plugin-transform-typeof-symbol": "^7.24.7", "@babel/plugin-transform-unicode-escapes": "^7.24.7", "@babel/plugin-transform-unicode-property-regex": "^7.24.7", "@babel/plugin-transform-unicode-regex": "^7.24.7", "@babel/plugin-transform-unicode-sets-regex": "^7.24.7", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.10.4", "babel-plugin-polyfill-regenerator": "^0.6.1", "core-js-compat": "^3.31.0", "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/preset-modules": { "version": "0.1.6-no-external-plugins", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/types": "^7.4.4", "esutils": "^2.0.2" }, "peerDependencies": { "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, "node_modules/@babel/regjsgen": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", "dev": true }, "node_modules/@babel/runtime": { "version": "7.15.4", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz", "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==", "dev": true, "dependencies": { "regenerator-runtime": "^0.13.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", "dev": true, "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/parser": "^7.24.7", "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/generator": "^7.24.7", "@babel/helper-environment-visitor": "^7.24.7", "@babel/helper-function-name": "^7.24.7", "@babel/helper-hoist-variables": "^7.24.7", "@babel/helper-split-export-declaration": "^7.24.7", "@babel/parser": "^7.24.7", "@babel/types": "^7.24.7", "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.24.7", "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "dev": true, "engines": { "node": ">=0.1.90" } }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, "dependencies": { "eslint-visitor-keys": "^3.3.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.1.tgz", "integrity": "sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.6.0", "globals": "^13.19.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": "^12.22.0 || ^14.17.0 || >=16.0.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 }, "node_modules/@eslint/eslintrc/node_modules/globals": { "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" }, "engines": { "node": ">=8" }, "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, "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "node_modules/@eslint/js": { "version": "8.57.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@gar/promisify": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", "dev": true }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "deprecated": "Use @eslint/config-array instead", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^2.0.2", "debug": "^4.3.1", "minimatch": "^3.0.5" }, "engines": { "node": ">=10.10.0" } }, "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, "engines": { "node": ">=12.22" }, "funding": { "type": "github", "url": "https://github.com/sponsors/nzakas" } }, "node_modules/@humanwhocodes/object-schema": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "deprecated": "Use @eslint/object-schema instead", "dev": true }, "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==", "dev": true, "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.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/@isaacs/cliui/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==", "dev": true, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@isaacs/cliui/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==", "dev": true }, "node_modules/@isaacs/cliui/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==", "dev": true, "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/@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==", "dev": true, "dependencies": { "ansi-regex": "^6.0.1" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/@isaacs/cliui/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==", "dev": true, "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/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" } }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { "version": "5.1.1-v1", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", "dev": true, "dependencies": { "eslint-scope": "5.1.1" } }, "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" }, "engines": { "node": ">=8.0.0" } }, "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==", "dev": true, "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==", "dev": true, "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==", "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" }, "engines": { "node": ">= 8" } }, "node_modules/@npmcli/fs": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", "dev": true, "dependencies": { "semver": "^7.3.5" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@npmcli/fs/node_modules/semver": { "version": "7.5.1", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/@npmcli/git": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", "dev": true, "dependencies": { "@npmcli/promise-spawn": "^6.0.0", "lru-cache": "^7.4.4", "npm-pick-manifest": "^8.0.0", "proc-log": "^3.0.0", "promise-inflight": "^1.0.1", "promise-retry": "^2.0.1", "semver": "^7.3.5", "which": "^3.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@npmcli/git/node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, "engines": { "node": ">=12" } }, "node_modules/@npmcli/git/node_modules/semver": { "version": "7.5.1", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/@npmcli/git/node_modules/semver/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=10" } }, "node_modules/@npmcli/git/node_modules/which": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", "dev": true, "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/which.js" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@npmcli/installed-package-contents": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", "dev": true, "dependencies": { "npm-bundled": "^3.0.0", "npm-normalize-package-bin": "^3.0.0" }, "bin": { "installed-package-contents": "lib/index.js" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@npmcli/move-file": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", "deprecated": "This functionality has been moved to @npmcli/fs", "dev": true, "dependencies": { "mkdirp": "^1.0.4", "rimraf": "^3.0.2" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/@npmcli/move-file/node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, "bin": { "mkdirp": "bin/cmd.js" }, "engines": { "node": ">=10" } }, "node_modules/@npmcli/node-gyp": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@npmcli/promise-spawn": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", "dev": true, "dependencies": { "which": "^3.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@npmcli/promise-spawn/node_modules/which": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", "dev": true, "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/which.js" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@npmcli/run-script": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", "dev": true, "dependencies": { "@npmcli/node-gyp": "^3.0.0", "@npmcli/promise-spawn": "^6.0.0", "node-gyp": "^9.0.0", "read-package-json-fast": "^3.0.0", "which": "^3.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@npmcli/run-script/node_modules/which": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", "dev": true, "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/which.js" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "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==", "dev": true, "optional": true, "engines": { "node": ">=14" } }, "node_modules/@puppeteer/browsers": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.4.1.tgz", "integrity": "sha512-H43VosMzywHCcYcgv0GXXopvwnV21Ud9g2aXbPlQUJj1Xcz9V0wBwHeFz6saFhx/3VKisZfI1GEKEOhQCau7Vw==", "dev": true, "dependencies": { "debug": "4.3.4", "extract-zip": "2.0.1", "progress": "2.0.3", "proxy-agent": "6.2.1", "tar-fs": "2.1.1", "unbzip2-stream": "1.4.3", "yargs": "17.7.1" }, "bin": { "browsers": "lib/cjs/main-cli.js" }, "engines": { "node": ">=16.3.0" }, "peerDependencies": { "typescript": ">= 4.7.4" }, "peerDependenciesMeta": { "typescript": { "optional": true } } }, "node_modules/@puppeteer/browsers/node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" }, "engines": { "node": ">=12" } }, "node_modules/@puppeteer/browsers/node_modules/yargs": { "version": "17.7.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", "dev": true, "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" }, "engines": { "node": ">=12" } }, "node_modules/@puppeteer/browsers/node_modules/yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "engines": { "node": ">=12" } }, "node_modules/@rollup/plugin-babel": { "version": "6.0.4", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-6.0.4.tgz", "integrity": "sha512-YF7Y52kFdFT/xVSuVdjkV5ZdX/3YtmX0QulG+x0taQOtJdHYzVU61aSSkAgVJ7NOv6qPkIYiJSgSWWN/DM5sGw==", "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.18.6", "@rollup/pluginutils": "^5.0.1" }, "engines": { "node": ">=14.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0", "@types/babel__core": "^7.1.9", "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "peerDependenciesMeta": { "@types/babel__core": { "optional": true }, "rollup": { "optional": true } } }, "node_modules/@rollup/plugin-commonjs": { "version": "26.0.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-26.0.1.tgz", "integrity": "sha512-UnsKoZK6/aGIH6AdkptXhNvhaqftcjq3zZdT+LY5Ftms6JR06nADcDsYp5hTU9E2lbJUEOhdlY5J4DNTneM+jQ==", "dev": true, "dependencies": { "@rollup/pluginutils": "^5.0.1", "commondir": "^1.0.1", "estree-walker": "^2.0.2", "glob": "^10.4.1", "is-reference": "1.2.1", "magic-string": "^0.30.3" }, "engines": { "node": ">=16.0.0 || 14 >= 14.17" }, "peerDependencies": { "rollup": "^2.68.0||^3.0.0||^4.0.0" }, "peerDependenciesMeta": { "rollup": { "optional": true } } }, "node_modules/@rollup/plugin-commonjs/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==", "dev": true, "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/@rollup/plugin-commonjs/node_modules/glob": { "version": "10.4.1", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, "engines": { "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@rollup/plugin-commonjs/node_modules/jackspeak": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, "engines": { "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/isaacs" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "node_modules/@rollup/plugin-commonjs/node_modules/minimatch": { "version": "9.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@rollup/plugin-commonjs/node_modules/minipass": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/@rollup/plugin-node-resolve": { "version": "15.2.3", "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz", "integrity": "sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==", "dev": true, "dependencies": { "@rollup/pluginutils": "^5.0.1", "@types/resolve": "1.20.2", "deepmerge": "^4.2.2", "is-builtin-module": "^3.2.1", "is-module": "^1.0.0", "resolve": "^1.22.1" }, "engines": { "node": ">=14.0.0" }, "peerDependencies": { "rollup": "^2.78.0||^3.0.0||^4.0.0" }, "peerDependenciesMeta": { "rollup": { "optional": true } } }, "node_modules/@rollup/plugin-terser": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", "dev": true, "dependencies": { "serialize-javascript": "^6.0.1", "smob": "^1.0.0", "terser": "^5.17.4" }, "engines": { "node": ">=14.0.0" }, "peerDependencies": { "rollup": "^2.0.0||^3.0.0||^4.0.0" }, "peerDependenciesMeta": { "rollup": { "optional": true } } }, "node_modules/@rollup/pluginutils": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", "dev": true, "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^2.3.1" }, "engines": { "node": ">=14.0.0" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "peerDependenciesMeta": { "rollup": { "optional": true } } }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.18.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==", "cpu": [ "arm" ], "dev": true, "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { "version": "4.18.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz", "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==", "cpu": [ "arm64" ], "dev": true, "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { "version": "4.18.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz", "integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==", "cpu": [ "arm64" ], "dev": true, "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { "version": "4.18.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz", "integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==", "cpu": [ "x64" ], "dev": true, "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { "version": "4.18.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz", "integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==", "cpu": [ "arm" ], "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { "version": "4.18.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz", "integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==", "cpu": [ "arm" ], "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { "version": "4.18.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz", "integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==", "cpu": [ "arm64" ], "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { "version": "4.18.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz", "integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==", "cpu": [ "arm64" ], "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { "version": "4.18.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz", "integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==", "cpu": [ "ppc64" ], "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { "version": "4.18.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz", "integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==", "cpu": [ "riscv64" ], "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { "version": "4.18.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz", "integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==", "cpu": [ "s390x" ], "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { "version": "4.18.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz", "integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==", "cpu": [ "x64" ], "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { "version": "4.18.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz", "integrity": "sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==", "cpu": [ "x64" ], "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { "version": "4.18.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz", "integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==", "cpu": [ "arm64" ], "dev": true, "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { "version": "4.18.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz", "integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==", "cpu": [ "ia32" ], "dev": true, "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { "version": "4.18.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz", "integrity": "sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==", "cpu": [ "x64" ], "dev": true, "optional": true, "os": [ "win32" ] }, "node_modules/@sigstore/protobuf-specs": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.1.0.tgz", "integrity": "sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ==", "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@sigstore/tuf": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.0.tgz", "integrity": "sha512-bLzi9GeZgMCvjJeLUIfs8LJYCxrPRA8IXQkzUtaFKKVPTz0mucRyqFcV2U20yg9K+kYAD0YSitzGfRZCFLjdHQ==", "dev": true, "dependencies": { "@sigstore/protobuf-specs": "^0.1.0", "make-fetch-happen": "^11.0.1", "tuf-js": "^1.1.3" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@sigstore/tuf/node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, "engines": { "node": ">=12" } }, "node_modules/@sigstore/tuf/node_modules/make-fetch-happen": { "version": "11.1.1", "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", "dev": true, "dependencies": { "agentkeepalive": "^4.2.1", "cacache": "^17.0.0", "http-cache-semantics": "^4.1.1", "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.0", "is-lambda": "^1.0.1", "lru-cache": "^7.7.1", "minipass": "^5.0.0", "minipass-fetch": "^3.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.3", "promise-retry": "^2.0.1", "socks-proxy-agent": "^7.0.0", "ssri": "^10.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@sigstore/tuf/node_modules/minipass-fetch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", "dev": true, "dependencies": { "minipass": "^5.0.0", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" }, "optionalDependencies": { "encoding": "^0.1.13" } }, "node_modules/@sindresorhus/is": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sindresorhus/is?sponsor=1" } }, "node_modules/@socket.io/component-emitter": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", "dev": true }, "node_modules/@swc/helpers": { "version": "0.4.36", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.36.tgz", "integrity": "sha512-5lxnyLEYFskErRPenYItLRSge5DjrJngYKdVjRSrWfza9G6KkgHEXi0vUZiyUeMU5JfXH1YnvXZzSp8ul88o2Q==", "dev": true, "dependencies": { "legacy-swc-helpers": "npm:@swc/helpers@=0.4.14", "tslib": "^2.4.0" } }, "node_modules/@szmarczak/http-timer": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", "dev": true, "dependencies": { "defer-to-connect": "^2.0.0" }, "engines": { "node": ">=10" } }, "node_modules/@target/custom-event-polyfill": { "version": "1.1.0", "resolved": "git+ssh://git@github.com/Adobe-Marketing-Cloud/custom-event-polyfill.git#2a28329ad98fdaf578054e2390f6ecd77d2eae91", "integrity": "sha512-kAOa23Rvg3HtSXcn5ka8BRyL4LnPHdn8WnAEVkwU/c7+ejrewv7HaMza4JDnMGRTvfX12H/sQ1dMPU7BxoNvSg==", "dev": true, "license": "ISC" }, "node_modules/@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "dev": true, "engines": { "node": ">= 10" } }, "node_modules/@tufjs/canonical-json": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@tufjs/models": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", "dev": true, "dependencies": { "@tufjs/canonical-json": "1.0.0", "minimatch": "^9.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@tufjs/models/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==", "dev": true, "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/@tufjs/models/node_modules/minimatch": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@types/cacheable-request": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", "dev": true, "dependencies": { "@types/http-cache-semantics": "*", "@types/keyv": "^3.1.4", "@types/node": "*", "@types/responselike": "^1.0.0" } }, "node_modules/@types/cookie": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", "dev": true }, "node_modules/@types/cors": { "version": "2.8.17", "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, "node_modules/@types/http-cache-semantics": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", "dev": true }, "node_modules/@types/jasmine": { "version": "5.1.4", "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.4.tgz", "integrity": "sha512-px7OMFO/ncXxixDe1zR13V1iycqWae0MxTaw62RpFlksUi5QuNWgQJFkTQjIOvrmutJbI7Fp2Y2N1F6D2R4G6w==", "dev": true }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true, "peer": true }, "node_modules/@types/keyv": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/node": { "version": "16.11.6", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.6.tgz", "integrity": "sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==", "dev": true }, "node_modules/@types/puppeteer": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/@types/puppeteer/-/puppeteer-7.0.4.tgz", "integrity": "sha512-ja78vquZc8y+GM2al07GZqWDKQskQXygCDiu0e3uO0DMRKqE0MjrFBFmTulfPYzLB6WnL7Kl2tFPy0WXSpPomg==", "deprecated": "This is a stub types definition. puppeteer provides its own type definitions, so you do not need this installed.", "dev": true, "dependencies": { "puppeteer": "*" } }, "node_modules/@types/puppeteer-core": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/@types/puppeteer-core/-/puppeteer-core-5.4.0.tgz", "integrity": "sha512-yqRPuv4EFcSkTyin6Yy17pN6Qz2vwVwTCJIDYMXbE3j8vTPhv0nCQlZOl5xfi0WHUkqvQsjAR8hAfjeMCoetwg==", "dev": true, "dependencies": { "@types/puppeteer": "*" } }, "node_modules/@types/resolve": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", "dev": true }, "node_modules/@types/responselike": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/which": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/which/-/which-1.3.2.tgz", "integrity": "sha512-8oDqyLC7eD4HM307boe2QWKyuzdzWBj56xI/imSl2cpL+U3tCMaTAkMJ4ee5JBZ/FsOJlvRGeIShiZDAl1qERA==", "dev": true }, "node_modules/@types/yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", "dev": true, "optional": true, "dependencies": { "@types/node": "*" } }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, "node_modules/@wdio/config": { "version": "6.12.1", "resolved": "https://registry.npmjs.org/@wdio/config/-/config-6.12.1.tgz", "integrity": "sha512-V5hTIW5FNlZ1W33smHF4Rd5BKjGW2KeYhyXDQfXHjqLCeRiirZ9fABCo9plaVQDnwWSUMWYaAaIAifV82/oJCQ==", "dev": true, "dependencies": { "@wdio/logger": "6.10.10", "deepmerge": "^4.0.0", "glob": "^7.1.2" }, "engines": { "node": ">=10.0.0" } }, "node_modules/@wdio/logger": { "version": "6.10.10", "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-6.10.10.tgz", "integrity": "sha512-2nh0hJz9HeZE0VIEMI+oPgjr/Q37ohrR9iqsl7f7GW5ik+PnKYCT9Eab5mR1GNMG60askwbskgGC1S9ygtvrSw==", "dev": true, "dependencies": { "chalk": "^4.0.0", "loglevel": "^1.6.0", "loglevel-plugin-prefix": "^0.8.4", "strip-ansi": "^6.0.0" }, "engines": { "node": ">=10.0.0" } }, "node_modules/@wdio/logger/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, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@wdio/logger/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, "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/@wdio/logger/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, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/@wdio/logger/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 }, "node_modules/@wdio/logger/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, "engines": { "node": ">=8" } }, "node_modules/@wdio/logger/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, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/@wdio/protocols": { "version": "6.12.0", "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-6.12.0.tgz", "integrity": "sha512-UhTBZxClCsM3VjaiDp4DoSCnsa7D1QNmI2kqEBfIpyNkT3GcZhJb7L+nL0fTkzCwi7+/uLastb3/aOwH99gt0A==", "dev": true, "engines": { "node": ">=10.0.0" } }, "node_modules/@wdio/repl": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-6.11.0.tgz", "integrity": "sha512-FxrFKiTkFyELNGGVEH1uijyvNY7lUpmff6x+FGskFGZB4uSRs0rxkOMaEjxnxw7QP1zgQKr2xC7GyO03gIGRGg==", "dev": true, "dependencies": { "@wdio/utils": "6.11.0" }, "engines": { "node": ">=10.0.0" } }, "node_modules/@wdio/utils": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-6.11.0.tgz", "integrity": "sha512-vf0sOQzd28WbI26d6/ORrQ4XKWTzSlWLm9W/K/eJO0NASKPEzR+E+Q2kaa+MJ4FKXUpjbt+Lxfo+C26TzBk7tg==", "dev": true, "dependencies": { "@wdio/logger": "6.10.10" }, "engines": { "node": ">=10.0.0" } }, "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 }, "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==", "dev": true, "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" }, "engines": { "node": ">= 0.6" } }, "node_modules/acorn": { "version": "8.12.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", "dev": true, "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, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, "dependencies": { "debug": "4" }, "engines": { "node": ">= 6.0.0" } }, "node_modules/agentkeepalive": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz", "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==", "dev": true, "dependencies": { "debug": "^4.1.0", "depd": "^2.0.0", "humanize-ms": "^1.2.1" }, "engines": { "node": ">= 8.0.0" } }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" }, "engines": { "node": ">=8" } }, "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, "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-align": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "dev": true, "dependencies": { "string-width": "^4.1.0" } }, "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==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "dependencies": { "color-convert": "^1.9.0" }, "engines": { "node": ">=4" } }, "node_modules/anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" }, "engines": { "node": ">= 8" } }, "node_modules/aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", "dev": true }, "node_modules/arch": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/feross" }, { "type": "patreon", "url": "https://www.patreon.com/feross" }, { "type": "consulting", "url": "https://feross.org/support" } ] }, "node_modules/archive-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz", "integrity": "sha512-zV4Ky0v1F8dBrdYElwTvQhweQ0P7Kwc1aluqJsYtOBP01jXcWCyW2IEfI1YiqsG+Iy7ZR+o5LF1N+PGECBxHWA==", "dev": true, "dependencies": { "file-type": "^4.2.0" }, "engines": { "node": ">=4" } }, "node_modules/archive-type/node_modules/file-type": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", "integrity": "sha512-f2UbFQEk7LXgWpi5ntcO86OeA/cC80fuDDDaX/fZ2ZGel+AF7leRQqBBW1eJNiiQkrZlAoM6P+VYP5P6bOlDEQ==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/archiver": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", "dev": true, "dependencies": { "archiver-utils": "^2.1.0", "async": "^3.2.3", "buffer-crc32": "^0.2.1", "readable-stream": "^3.6.0", "readdir-glob": "^1.0.0", "tar-stream": "^2.2.0", "zip-stream": "^4.1.0" }, "engines": { "node": ">= 10" } }, "node_modules/archiver-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", "dev": true, "dependencies": { "glob": "^7.1.4", "graceful-fs": "^4.2.0", "lazystream": "^1.0.0", "lodash.defaults": "^4.2.0", "lodash.difference": "^4.5.0", "lodash.flatten": "^4.4.0", "lodash.isplainobject": "^4.0.6", "lodash.union": "^4.6.0", "normalize-path": "^3.0.0", "readable-stream": "^2.0.0" }, "engines": { "node": ">= 6" } }, "node_modules/archiver/node_modules/async": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", "dev": true }, "node_modules/archiver/node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "node_modules/archiver/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==", "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" }, "engines": { "node": ">= 6" } }, "node_modules/archiver/node_modules/tar-stream": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "dev": true, "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" }, "engines": { "node": ">=6" } }, "node_modules/are-we-there-yet": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", "dev": true, "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/are-we-there-yet/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==", "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" }, "engines": { "node": ">= 6" } }, "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, "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/array-buffer-byte-length": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", "dev": true, "peer": true, "dependencies": { "call-bind": "^1.0.2", "is-array-buffer": "^3.0.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array-includes": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", "dev": true, "peer": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4", "get-intrinsic": "^1.1.3", "is-string": "^1.0.7" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array.prototype.flat": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", "dev": true, "peer": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4", "es-shim-unscopables": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array.prototype.flatmap": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", "dev": true, "peer": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4", "es-shim-unscopables": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "dev": true, "dependencies": { "safer-buffer": "~2.1.0" } }, "node_modules/assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true, "engines": { "node": ">=0.8" } }, "node_modules/async": { "version": "2.6.4", "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dev": true, "dependencies": { "lodash": "^4.17.14" } }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, "node_modules/at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true, "engines": { "node": ">= 4.0.0" } }, "node_modules/atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true, "bin": { "atob": "bin/atob.js" }, "engines": { "node": ">= 4.5.0" } }, "node_modules/available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "dev": true, "peer": true, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", "dev": true, "engines": { "node": "*" } }, "node_modules/aws4": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.4.11", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.6", "@babel/helper-define-polyfill-provider": "^0.6.2", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-corejs3": { "version": "0.10.4", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", "dev": true, "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.1", "core-js-compat": "^3.36.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", "dev": true, "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.2" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.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==", "dev": 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==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/feross" }, { "type": "patreon", "url": "https://www.patreon.com/feross" }, { "type": "consulting", "url": "https://feross.org/support" } ] }, "node_modules/base64id": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "dev": true, "engines": { "node": "^4.5.0 || >= 5.9" } }, "node_modules/basic-auth": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", "dev": true, "dependencies": { "safe-buffer": "5.1.2" }, "engines": { "node": ">= 0.8" } }, "node_modules/basic-ftp": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.3.tgz", "integrity": "sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==", "dev": true, "engines": { "node": ">=10.0.0" } }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "dev": true, "dependencies": { "tweetnacl": "^0.14.3" } }, "node_modules/bin-check": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bin-check/-/bin-check-4.1.0.tgz", "integrity": "sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==", "dev": true, "dependencies": { "execa": "^0.7.0", "executable": "^4.1.0" }, "engines": { "node": ">=4" } }, "node_modules/bin-version": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-3.1.0.tgz", "integrity": "sha512-Mkfm4iE1VFt4xd4vH+gx+0/71esbfus2LsnCGe8Pi4mndSPyT+NGES/Eg99jx8/lUGWfu3z2yuB/bt5UB+iVbQ==", "dev": true, "dependencies": { "execa": "^1.0.0", "find-versions": "^3.0.0" }, "engines": { "node": ">=6" } }, "node_modules/bin-version-check": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-4.0.0.tgz", "integrity": "sha512-sR631OrhC+1f8Cvs8WyVWOA33Y8tgwjETNPyyD/myRBXLkfS/vl74FmH/lFcRl9KY3zwGh7jFhvyk9vV3/3ilQ==", "dev": true, "dependencies": { "bin-version": "^3.0.0", "semver": "^5.6.0", "semver-truncate": "^1.1.2" }, "engines": { "node": ">=6" } }, "node_modules/bin-version-check/node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, "bin": { "semver": "bin/semver" } }, "node_modules/bin-version/node_modules/cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "dependencies": { "nice-try": "^1.0.4", "path-key": "^2.0.1", "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" }, "engines": { "node": ">=4.8" } }, "node_modules/bin-version/node_modules/execa": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "dependencies": { "cross-spawn": "^6.0.0", "get-stream": "^4.0.0", "is-stream": "^1.1.0", "npm-run-path": "^2.0.0", "p-finally": "^1.0.0", "signal-exit": "^3.0.0", "strip-eof": "^1.0.0" }, "engines": { "node": ">=6" } }, "node_modules/bin-version/node_modules/get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "dependencies": { "pump": "^3.0.0" }, "engines": { "node": ">=6" } }, "node_modules/bin-version/node_modules/path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/bin-version/node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, "bin": { "semver": "bin/semver" } }, "node_modules/bin-version/node_modules/shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "dev": true, "dependencies": { "shebang-regex": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/bin-version/node_modules/shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/bin-version/node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "dependencies": { "isexe": "^2.0.0" }, "bin": { "which": "bin/which" } }, "node_modules/bin-wrapper": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bin-wrapper/-/bin-wrapper-4.1.0.tgz", "integrity": "sha512-hfRmo7hWIXPkbpi0ZltboCMVrU+0ClXR/JgbCKKjlDjQf6igXa7OwdqNcFWQZPZTgiY7ZpzE3+LjjkLiTN2T7Q==", "dev": true, "dependencies": { "bin-check": "^4.1.0", "bin-version-check": "^4.0.0", "download": "^7.1.0", "import-lazy": "^3.1.0", "os-filter-obj": "^2.0.0", "pify": "^4.0.1" }, "engines": { "node": ">=6" } }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/bl": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", "dev": true, "dependencies": { "readable-stream": "^2.3.5", "safe-buffer": "^5.1.1" } }, "node_modules/body-parser": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "dev": true, "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.11.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/body-parser/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "dependencies": { "ms": "2.0.0" } }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, "node_modules/body-parser/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==", "dev": true, "dependencies": { "ee-first": "1.1.1" }, "engines": { "node": ">= 0.8" } }, "node_modules/body-parser/node_modules/qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dev": true, "dependencies": { "side-channel": "^1.0.4" }, "engines": { "node": ">=0.6" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/boolean": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", "dev": true }, "node_modules/boxen": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", "dev": true, "dependencies": { "ansi-align": "^3.0.0", "camelcase": "^6.2.0", "chalk": "^4.1.0", "cli-boxes": "^2.2.1", "string-width": "^4.2.2", "type-fest": "^0.20.2", "widest-line": "^3.1.0", "wrap-ansi": "^7.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/boxen/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, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/boxen/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, "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/boxen/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, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/boxen/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 }, "node_modules/boxen/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, "engines": { "node": ">=8" } }, "node_modules/boxen/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, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "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==", "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "node_modules/braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "dependencies": { "fill-range": "^7.0.1" }, "engines": { "node": ">=8" } }, "node_modules/brotli": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", "dev": true, "dependencies": { "base64-js": "^1.1.2" } }, "node_modules/brotli-size": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/brotli-size/-/brotli-size-4.0.0.tgz", "integrity": "sha512-uA9fOtlTRC0iqKfzff1W34DXUA3GyVqbUaeo3Rw3d4gd1eavKVCETXrn3NzO74W+UVkG3UHu8WxUi+XvKI/huA==", "dev": true, "dependencies": { "duplexer": "0.1.1" }, "engines": { "node": ">= 10.16.0" } }, "node_modules/browserslist": { "version": "4.23.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", "dev": true, "funding": [ { "type": "opencollective", "url": "https://opencollective.com/browserslist" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" }, { "type": "github", "url": "https://github.com/sponsors/ai" } ], "dependencies": { "caniuse-lite": "^1.0.30001629", "electron-to-chromium": "^1.4.796", "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.16" }, "bin": { "browserslist": "cli.js" }, "engines": { "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, "node_modules/buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/feross" }, { "type": "patreon", "url": "https://www.patreon.com/feross" }, { "type": "consulting", "url": "https://feross.org/support" } ], "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "node_modules/buffer-alloc": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", "dev": true, "dependencies": { "buffer-alloc-unsafe": "^1.1.0", "buffer-fill": "^1.0.0" } }, "node_modules/buffer-alloc-unsafe": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", "dev": true }, "node_modules/buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "dev": true, "engines": { "node": "*" } }, "node_modules/buffer-fill": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", "dev": true }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, "node_modules/builtin-modules": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "dev": true, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/builtins": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", "dev": true, "dependencies": { "semver": "^7.0.0" } }, "node_modules/builtins/node_modules/semver": { "version": "7.5.1", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, "engines": { "node": ">= 0.8" } }, "node_modules/cacache": { "version": "17.1.3", "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.3.tgz", "integrity": "sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg==", "dev": true, "dependencies": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", "glob": "^10.2.2", "lru-cache": "^7.7.1", "minipass": "^5.0.0", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^4.0.0", "ssri": "^10.0.0", "tar": "^6.1.11", "unique-filename": "^3.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/cacache/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==", "dev": true, "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/cacache/node_modules/glob": { "version": "10.2.7", "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.7.tgz", "integrity": "sha512-jTKehsravOJo8IJxUGfZILnkvVJM/MOfHRs8QcXolVef2zNI9Tqyy5+SeuOAZd3upViEZQLyFpQhYiHLrMUNmA==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.0.3", "minimatch": "^9.0.1", "minipass": "^5.0.0 || ^6.0.2", "path-scurry": "^1.7.0" }, "bin": { "glob": "dist/cjs/src/bin.js" }, "engines": { "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/cacache/node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, "engines": { "node": ">=12" } }, "node_modules/cacache/node_modules/minimatch": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/cacheable-lookup": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", "dev": true, "engines": { "node": ">=10.6.0" } }, "node_modules/cacheable-request": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", "dev": true, "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", "http-cache-semantics": "^4.0.0", "keyv": "^4.0.0", "lowercase-keys": "^2.0.0", "normalize-url": "^6.0.1", "responselike": "^2.0.0" }, "engines": { "node": ">=8" } }, "node_modules/cacheable-request/node_modules/get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, "dependencies": { "pump": "^3.0.0" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" }, "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, "engines": { "node": ">=6" } }, "node_modules/camel-case": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", "dev": true, "dependencies": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" } }, "node_modules/camelcase": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/caniuse-lite": { "version": "1.0.30001636", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz", "integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==", "dev": true, "funding": [ { "type": "opencollective", "url": "https://opencollective.com/browserslist" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" }, { "type": "github", "url": "https://github.com/sponsors/ai" } ] }, "node_modules/capital-case": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", "dev": true, "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3", "upper-case-first": "^2.0.2" } }, "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, "node_modules/caw": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/caw/-/caw-2.0.1.tgz", "integrity": "sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==", "dev": true, "dependencies": { "get-proxy": "^2.0.0", "isurl": "^1.0.0-alpha5", "tunnel-agent": "^0.6.0", "url-to-options": "^1.0.1" }, "engines": { "node": ">=4" } }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" }, "engines": { "node": ">=4" } }, "node_modules/change-case": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", "dev": true, "dependencies": { "camel-case": "^4.1.2", "capital-case": "^1.0.4", "constant-case": "^3.0.4", "dot-case": "^3.0.4", "header-case": "^2.0.4", "no-case": "^3.0.4", "param-case": "^3.0.4", "pascal-case": "^3.1.2", "path-case": "^3.0.4", "sentence-case": "^3.0.4", "snake-case": "^3.0.4", "tslib": "^2.0.3" } }, "node_modules/chokidar": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", "dev": true, "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "engines": { "node": ">= 8.10.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true }, "node_modules/chrome-launcher": { "version": "0.13.4", "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.13.4.tgz", "integrity": "sha512-nnzXiDbGKjDSK6t2I+35OAPBy5Pw/39bgkb/ZAFwMhwJbdYBp6aH+vW28ZgtjdU890Q7D+3wN/tB8N66q5Gi2A==", "dev": true, "dependencies": { "@types/node": "*", "escape-string-regexp": "^1.0.5", "is-wsl": "^2.2.0", "lighthouse-logger": "^1.0.0", "mkdirp": "^0.5.3", "rimraf": "^3.0.2" } }, "node_modules/chromium-bidi": { "version": "0.4.11", "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.11.tgz", "integrity": "sha512-p03ajLhlQ5gebw3cmbDBFmBc2wnJM5dnXS8Phu6mblGn/KQd76yOVL5VwE0VAisa7oazNfKGTaXlIZ8Q5Bb9OA==", "dev": true, "dependencies": { "mitt": "3.0.0" }, "peerDependencies": { "devtools-protocol": "*" } }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/cli-boxes": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", "dev": true, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" } }, "node_modules/clone": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", "dev": true, "engines": { "node": ">=0.8" } }, "node_modules/clone-response": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", "dev": true, "dependencies": { "mimic-response": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "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==", "dev": true, "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==", "dev": true }, "node_modules/color-support": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "dev": true, "bin": { "color-support": "bin.js" } }, "node_modules/colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "dev": true, "engines": { "node": ">=0.1.90" } }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "dependencies": { "delayed-stream": "~1.0.0" }, "engines": { "node": ">= 0.8" } }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true }, "node_modules/compress-commons": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", "dev": true, "dependencies": { "buffer-crc32": "^0.2.13", "crc32-stream": "^4.0.2", "normalize-path": "^3.0.0", "readable-stream": "^3.6.0" }, "engines": { "node": ">= 10" } }, "node_modules/compress-commons/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==", "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" }, "engines": { "node": ">= 6" } }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, "node_modules/config-chain": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", "dev": true, "dependencies": { "ini": "^1.3.4", "proto-list": "~1.2.1" } }, "node_modules/connect": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", "dev": true, "dependencies": { "debug": "2.6.9", "finalhandler": "1.1.2", "parseurl": "~1.3.3", "utils-merge": "1.0.1" }, "engines": { "node": ">= 0.10.0" } }, "node_modules/connect/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "dependencies": { "ms": "2.0.0" } }, "node_modules/connect/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", "dev": true }, "node_modules/constant-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", "dev": true, "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3", "upper-case": "^2.0.2" } }, "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==", "dev": true, "dependencies": { "safe-buffer": "5.2.1" }, "engines": { "node": ">= 0.6" } }, "node_modules/content-disposition/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==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/feross" }, { "type": "patreon", "url": "https://www.patreon.com/feross" }, { "type": "consulting", "url": "https://feross.org/support" } ] }, "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==", "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, "node_modules/cookie": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/core-js": { "version": "3.37.1", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.1.tgz", "integrity": "sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==", "dev": true, "hasInstallScript": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, "node_modules/core-js-compat": { "version": "3.37.1", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", "dev": true, "dependencies": { "browserslist": "^4.23.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, "node_modules/cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "dev": true, "dependencies": { "object-assign": "^4", "vary": "^1" }, "engines": { "node": ">= 0.10" } }, "node_modules/corser": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", "integrity": "sha1-jtolLsqrWEDc2XXOuQ2TcMgZ/4c=", "dev": true, "engines": { "node": ">= 0.4.0" } }, "node_modules/cosmiconfig": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", "dev": true, "dependencies": { "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "parse-json": "^5.0.0", "path-type": "^4.0.0" }, "engines": { "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/d-fischer" } }, "node_modules/cosmiconfig/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 }, "node_modules/cosmiconfig/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, "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "node_modules/coveralls": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.1.1.tgz", "integrity": "sha512-+dxnG2NHncSD1NrqbSM3dn/lE57O6Qf/koe9+I7c+wzkqRmEvcp0kgJdxKInzYzkICKkFMZsX3Vct3++tsF9ww==", "dev": true, "dependencies": { "js-yaml": "^3.13.1", "lcov-parse": "^1.0.0", "log-driver": "^1.2.7", "minimist": "^1.2.5", "request": "^2.88.2" }, "bin": { "coveralls": "bin/coveralls.js" }, "engines": { "node": ">=6" } }, "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==", "dev": true, "bin": { "crc32": "bin/crc32.njs" }, "engines": { "node": ">=0.8" } }, "node_modules/crc32-stream": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", "dev": true, "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^3.4.0" }, "engines": { "node": ">= 10" } }, "node_modules/crc32-stream/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==", "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" }, "engines": { "node": ">= 6" } }, "node_modules/cross-fetch": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.6.tgz", "integrity": "sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==", "dev": true, "dependencies": { "node-fetch": "^2.6.11" } }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" }, "engines": { "node": ">= 8" } }, "node_modules/css-shorthand-properties": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/css-shorthand-properties/-/css-shorthand-properties-1.1.1.tgz", "integrity": "sha512-Md+Juc7M3uOdbAFwOYlTrccIZ7oCFuzrhKYQjdeUEW/sE1hv17Jp/Bws+ReOPpGVBTYCBoYo+G17V5Qo8QQ75A==", "dev": true }, "node_modules/css-value": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/css-value/-/css-value-0.0.1.tgz", "integrity": "sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==", "dev": true }, "node_modules/custom-event": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", "dev": true }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "dependencies": { "assert-plus": "^1.0.0" }, "engines": { "node": ">=0.10" } }, "node_modules/data-uri-to-buffer": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-5.0.1.tgz", "integrity": "sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg==", "dev": true, "engines": { "node": ">= 14" } }, "node_modules/date-format": { "version": "4.0.14", "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", "dev": true, "engines": { "node": ">=4.0" } }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { "ms": "2.1.2" }, "engines": { "node": ">=6.0" }, "peerDependenciesMeta": { "supports-color": { "optional": true } } }, "node_modules/decode-uri-component": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "dev": true, "engines": { "node": ">=0.10" } }, "node_modules/decompress": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", "dev": true, "dependencies": { "decompress-tar": "^4.0.0", "decompress-tarbz2": "^4.0.0", "decompress-targz": "^4.0.0", "decompress-unzip": "^4.0.1", "graceful-fs": "^4.1.10", "make-dir": "^1.0.0", "pify": "^2.3.0", "strip-dirs": "^2.0.0" }, "engines": { "node": ">=4" } }, "node_modules/decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "dev": true, "dependencies": { "mimic-response": "^3.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/decompress-response/node_modules/mimic-response": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/decompress-tar": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", "dev": true, "dependencies": { "file-type": "^5.2.0", "is-stream": "^1.1.0", "tar-stream": "^1.5.2" }, "engines": { "node": ">=4" } }, "node_modules/decompress-tar/node_modules/file-type": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/decompress-tarbz2": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", "dev": true, "dependencies": { "decompress-tar": "^4.1.0", "file-type": "^6.1.0", "is-stream": "^1.1.0", "seek-bzip": "^1.0.5", "unbzip2-stream": "^1.0.9" }, "engines": { "node": ">=4" } }, "node_modules/decompress-tarbz2/node_modules/file-type": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/decompress-targz": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", "dev": true, "dependencies": { "decompress-tar": "^4.1.1", "file-type": "^5.2.0", "is-stream": "^1.1.0" }, "engines": { "node": ">=4" } }, "node_modules/decompress-targz/node_modules/file-type": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/decompress-unzip": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", "integrity": "sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==", "dev": true, "dependencies": { "file-type": "^3.8.0", "get-stream": "^2.2.0", "pify": "^2.3.0", "yauzl": "^2.4.2" }, "engines": { "node": ">=4" } }, "node_modules/decompress-unzip/node_modules/file-type": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/decompress-unzip/node_modules/get-stream": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", "integrity": "sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==", "dev": true, "dependencies": { "object-assign": "^4.0.1", "pinkie-promise": "^2.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/decompress-unzip/node_modules/pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/decompress/node_modules/make-dir": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dev": true, "dependencies": { "pify": "^3.0.0" }, "engines": { "node": ">=4" } }, "node_modules/decompress/node_modules/make-dir/node_modules/pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/decompress/node_modules/pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, "engines": { "node": ">=0.10.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 }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/defer-to-connect": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "dev": true, "engines": { "node": ">=10" } }, "node_modules/define-properties": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dev": true, "dependencies": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/degenerator": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-4.0.2.tgz", "integrity": "sha512-HKwIFvZROUMfH3qI3gBpD61BYh7q3c3GXD5UGZzoVNJwVSYgZKvYl1fRMXc9ozoTxl/VZxKJ5v/bA+19tywFiw==", "dev": true, "dependencies": { "ast-types": "^0.13.2", "escodegen": "^1.8.1", "esprima": "^4.0.0", "vm2": "^3.9.17" }, "engines": { "node": ">= 14" } }, "node_modules/degenerator/node_modules/ast-types": { "version": "0.13.4", "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", "dev": true, "dependencies": { "tslib": "^2.0.1" }, "engines": { "node": ">=4" } }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true, "engines": { "node": ">=0.4.0" } }, "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", "dev": true }, "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==", "dev": true, "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==", "dev": true, "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" } }, "node_modules/detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true }, "node_modules/devtools": { "version": "6.12.1", "resolved": "https://registry.npmjs.org/devtools/-/devtools-6.12.1.tgz", "integrity": "sha512-JyG46suEiZmld7/UVeogkCWM0zYGt+2ML/TI+SkEp+bTv9cs46cDb0pKF3glYZJA7wVVL2gC07Ic0iCxyJEnCQ==", "dev": true, "dependencies": { "@wdio/config": "6.12.1", "@wdio/logger": "6.10.10", "@wdio/protocols": "6.12.0", "@wdio/utils": "6.11.0", "chrome-launcher": "^0.13.1", "edge-paths": "^2.1.0", "puppeteer-core": "^5.1.0", "ua-parser-js": "^0.7.21", "uuid": "^8.0.0" }, "engines": { "node": ">=10.0.0" } }, "node_modules/devtools-protocol": { "version": "0.0.818844", "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.818844.tgz", "integrity": "sha512-AD1hi7iVJ8OD0aMLQU5VK0XH9LDlA1+BcPIgrAxPfaibx2DbWucuyOhc4oyQCbnvDDO68nN6/LcKfqTP343Jjg==", "dev": true }, "node_modules/devtools/node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/dfa": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz", "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==", "dev": true }, "node_modules/di": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", "dev": true }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "dependencies": { "esutils": "^2.0.2" }, "engines": { "node": ">=6.0.0" } }, "node_modules/dom-serialize": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", "dev": true, "dependencies": { "custom-event": "~1.0.0", "ent": "~2.2.0", "extend": "^3.0.0", "void-elements": "^2.0.0" } }, "node_modules/dot-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", "dev": true, "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "node_modules/download": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/download/-/download-7.1.0.tgz", "integrity": "sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==", "dev": true, "dependencies": { "archive-type": "^4.0.0", "caw": "^2.0.1", "content-disposition": "^0.5.2", "decompress": "^4.2.0", "ext-name": "^5.0.0", "file-type": "^8.1.0", "filenamify": "^2.0.0", "get-stream": "^3.0.0", "got": "^8.3.1", "make-dir": "^1.2.0", "p-event": "^2.1.0", "pify": "^3.0.0" }, "engines": { "node": ">=6" } }, "node_modules/download/node_modules/@sindresorhus/is": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/download/node_modules/cacheable-request": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", "integrity": "sha512-vag0O2LKZ/najSoUwDbVlnlCFvhBE/7mGTY2B5FgCBDcRD+oVV1HYTOwM6JZfMg/hIcM6IwnTZ1uQQL5/X3xIQ==", "dev": true, "dependencies": { "clone-response": "1.0.2", "get-stream": "3.0.0", "http-cache-semantics": "3.8.1", "keyv": "3.0.0", "lowercase-keys": "1.0.0", "normalize-url": "2.0.1", "responselike": "1.0.2" } }, "node_modules/download/node_modules/cacheable-request/node_modules/lowercase-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", "integrity": "sha512-RPlX0+PHuvxVDZ7xX+EBVAp4RsVxP/TdDSN2mJYdiq1Lc4Hz7EUSjUI7RZrKKlmrIzVhf6Jo2stj7++gVarS0A==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/download/node_modules/clone-response": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", "integrity": "sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==", "dev": true, "dependencies": { "mimic-response": "^1.0.0" } }, "node_modules/download/node_modules/decompress-response": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", "dev": true, "dependencies": { "mimic-response": "^1.0.0" }, "engines": { "node": ">=4" } }, "node_modules/download/node_modules/got": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", "dev": true, "dependencies": { "@sindresorhus/is": "^0.7.0", "cacheable-request": "^2.1.1", "decompress-response": "^3.3.0", "duplexer3": "^0.1.4", "get-stream": "^3.0.0", "into-stream": "^3.1.0", "is-retry-allowed": "^1.1.0", "isurl": "^1.0.0-alpha5", "lowercase-keys": "^1.0.0", "mimic-response": "^1.0.0", "p-cancelable": "^0.4.0", "p-timeout": "^2.0.1", "pify": "^3.0.0", "safe-buffer": "^5.1.1", "timed-out": "^4.0.1", "url-parse-lax": "^3.0.0", "url-to-options": "^1.0.1" }, "engines": { "node": ">=4" } }, "node_modules/download/node_modules/http-cache-semantics": { "version": "3.8.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", "dev": true }, "node_modules/download/node_modules/json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", "dev": true }, "node_modules/download/node_modules/keyv": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", "dev": true, "dependencies": { "json-buffer": "3.0.0" } }, "node_modules/download/node_modules/lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/download/node_modules/make-dir": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dev": true, "dependencies": { "pify": "^3.0.0" }, "engines": { "node": ">=4" } }, "node_modules/download/node_modules/normalize-url": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", "dev": true, "dependencies": { "prepend-http": "^2.0.0", "query-string": "^5.0.1", "sort-keys": "^2.0.0" }, "engines": { "node": ">=4" } }, "node_modules/download/node_modules/p-cancelable": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/download/node_modules/pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/download/node_modules/responselike": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", "dev": true, "dependencies": { "lowercase-keys": "^1.0.0" } }, "node_modules/download/node_modules/sort-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", "integrity": "sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==", "dev": true, "dependencies": { "is-plain-obj": "^1.0.0" }, "engines": { "node": ">=4" } }, "node_modules/duplexer": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", "dev": true }, "node_modules/duplexer3": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", "dev": true }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "dev": true, "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" } }, "node_modules/edge-paths": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/edge-paths/-/edge-paths-2.2.1.tgz", "integrity": "sha512-AI5fC7dfDmCdKo3m5y7PkYE8m6bMqR6pvVpgtrZkkhcJXFLelUgkjrhk3kXXx8Kbw2cRaTT4LkOR7hqf39KJdw==", "dev": true, "dependencies": { "@types/which": "^1.3.2", "which": "^2.0.2" } }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, "node_modules/electron-to-chromium": { "version": "1.4.805", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.805.tgz", "integrity": "sha512-8W4UJwX/w9T0QSzINJckTKG6CYpAUTqsaWcWIsdud3I1FYJcMgW9QqT1/4CBff/pP/TihWh13OmiyY8neto6vw==", "dev": true }, "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==", "dev": true }, "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", "dev": true, "engines": { "node": ">= 0.8" } }, "node_modules/encoding": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dev": true, "optional": true, "dependencies": { "iconv-lite": "^0.6.2" } }, "node_modules/encoding/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, "optional": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, "dependencies": { "once": "^1.4.0" } }, "node_modules/engine.io": { "version": "6.5.5", "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.5.tgz", "integrity": "sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==", "dev": true, "dependencies": { "@types/cookie": "^0.4.1", "@types/cors": "^2.8.12", "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "2.0.0", "cookie": "~0.4.1", "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", "ws": "~8.17.1" }, "engines": { "node": ">=10.2.0" } }, "node_modules/engine.io-parser": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.2.tgz", "integrity": "sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==", "dev": true, "engines": { "node": ">=10.0.0" } }, "node_modules/ent": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", "dev": true }, "node_modules/env-paths": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/err-code": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", "dev": true }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/es-abstract": { "version": "1.21.2", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", "dev": true, "peer": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.5", "get-intrinsic": "^1.2.0", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "internal-slot": "^1.0.5", "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", "object-inspect": "^1.12.3", "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", "safe-regex-test": "^1.0.0", "string.prototype.trim": "^1.2.7", "string.prototype.trimend": "^1.0.6", "string.prototype.trimstart": "^1.0.6", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", "which-typed-array": "^1.1.9" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/es-set-tostringtag": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", "dev": true, "peer": true, "dependencies": { "get-intrinsic": "^1.1.3", "has": "^1.0.3", "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-shim-unscopables": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", "dev": true, "peer": true, "dependencies": { "has": "^1.0.3" } }, "node_modules/es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "peer": true, "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", "is-symbol": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/es6-error": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true }, "node_modules/escalade": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", "dev": true }, "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": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true, "engines": { "node": ">=0.8.0" } }, "node_modules/escodegen": { "version": "1.14.3", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", "dev": true, "dependencies": { "esprima": "^4.0.1", "estraverse": "^4.2.0", "esutils": "^2.0.2", "optionator": "^0.8.1" }, "bin": { "escodegen": "bin/escodegen.js", "esgenerate": "bin/esgenerate.js" }, "engines": { "node": ">=4.0" }, "optionalDependencies": { "source-map": "~0.6.1" } }, "node_modules/escodegen/node_modules/levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "dependencies": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/escodegen/node_modules/optionator": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, "dependencies": { "deep-is": "~0.1.3", "fast-levenshtein": "~2.0.6", "levn": "~0.3.0", "prelude-ls": "~1.1.2", "type-check": "~0.3.2", "word-wrap": "~1.2.3" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/escodegen/node_modules/prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true, "engines": { "node": ">= 0.8.0" } }, "node_modules/escodegen/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==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/escodegen/node_modules/type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "dependencies": { "prelude-ls": "~1.1.2" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/eslint": { "version": "8.57.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", "@eslint/js": "8.57.0", "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.2", "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-config-prettier": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, "peerDependencies": { "eslint": ">=7.0.0" } }, "node_modules/eslint-config-standard": { "version": "17.1.0", "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/feross" }, { "type": "patreon", "url": "https://www.patreon.com/feross" }, { "type": "consulting", "url": "https://feross.org/support" } ], "engines": { "node": ">=12.0.0" }, "peerDependencies": { "eslint": "^8.0.1", "eslint-plugin-import": "^2.25.2", "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", "eslint-plugin-promise": "^6.0.0" } }, "node_modules/eslint-import-resolver-node": { "version": "0.3.7", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", "dev": true, "peer": true, "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.11.0", "resolve": "^1.22.1" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "peer": true, "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-module-utils": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", "dev": true, "peer": true, "dependencies": { "debug": "^3.2.7" }, "engines": { "node": ">=4" }, "peerDependenciesMeta": { "eslint": { "optional": true } } }, "node_modules/eslint-module-utils/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "peer": true, "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-plugin-es-x": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-6.2.1.tgz", "integrity": "sha512-uR34zUhZ9EBoiSD2DdV5kHLpydVEvwWqjteUr9sXRgJknwbKZJZhdJ7uFnaTtd+Nr/2G3ceJHnHXrFhJ67n3Tw==", "dev": true, "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.1.2", "@eslint-community/regexpp": "^4.5.0" }, "engines": { "node": "^14.18.0 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/ota-meshi" }, "peerDependencies": { "eslint": ">=8" } }, "node_modules/eslint-plugin-import": { "version": "2.27.5", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", "dev": true, "peer": true, "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", "array.prototype.flatmap": "^1.3.1", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.7", "eslint-module-utils": "^2.7.4", "has": "^1.0.3", "is-core-module": "^2.11.0", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.values": "^1.1.6", "resolve": "^1.22.1", "semver": "^6.3.0", "tsconfig-paths": "^3.14.1" }, "engines": { "node": ">=4" }, "peerDependencies": { "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" } }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "peer": true, "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-plugin-import/node_modules/doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "peer": true, "dependencies": { "esutils": "^2.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/eslint-plugin-n": { "version": "16.0.0", "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.0.0.tgz", "integrity": "sha512-akkZTE3hsHBrq6CwmGuYCzQREbVUrA855kzcHqe6i0FLBkeY7Y/6tThCVkjUnjhvRBAlc+8lILcSe5QvvDpeZQ==", "dev": true, "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "builtins": "^5.0.1", "eslint-plugin-es-x": "^6.1.0", "ignore": "^5.1.1", "is-core-module": "^2.12.0", "minimatch": "^3.1.2", "resolve": "^1.22.2", "semver": "^7.5.0" }, "engines": { "node": ">=16.0.0" }, "funding": { "url": "https://github.com/sponsors/mysticatea" }, "peerDependencies": { "eslint": ">=7.0.0" } }, "node_modules/eslint-plugin-n/node_modules/semver": { "version": "7.5.1", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "peer": true, "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/eslint-plugin-promise": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", "dev": true, "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "node_modules/eslint-scope": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-scope/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, "engines": { "node": ">=4.0" } }, "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, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.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, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/eslint/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 }, "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, "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, "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 }, "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, "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, "dependencies": { "is-glob": "^4.0.3" }, "engines": { "node": ">=10.13.0" } }, "node_modules/eslint/node_modules/globals": { "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint/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, "engines": { "node": ">=8" } }, "node_modules/eslint/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, "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "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, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.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, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" }, "engines": { "node": ">=4" } }, "node_modules/esquery": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "dependencies": { "estraverse": "^5.1.0" }, "engines": { "node": ">=0.10" } }, "node_modules/esquery/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, "engines": { "node": ">=4.0" } }, "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, "dependencies": { "estraverse": "^5.2.0" }, "engines": { "node": ">=4.0" } }, "node_modules/esrecurse/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, "engines": { "node": ">=4.0" } }, "node_modules/estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, "engines": { "node": ">=4.0" } }, "node_modules/estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true }, "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, "engines": { "node": ">=0.10.0" } }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "dev": true }, "node_modules/execa": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", "integrity": "sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==", "dev": true, "dependencies": { "cross-spawn": "^5.0.1", "get-stream": "^3.0.0", "is-stream": "^1.1.0", "npm-run-path": "^2.0.0", "p-finally": "^1.0.0", "signal-exit": "^3.0.0", "strip-eof": "^1.0.0" }, "engines": { "node": ">=4" } }, "node_modules/execa/node_modules/cross-spawn": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", "dev": true, "dependencies": { "lru-cache": "^4.0.1", "shebang-command": "^1.2.0", "which": "^1.2.9" } }, "node_modules/execa/node_modules/lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, "dependencies": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" } }, "node_modules/execa/node_modules/shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "dev": true, "dependencies": { "shebang-regex": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/execa/node_modules/shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/execa/node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "dependencies": { "isexe": "^2.0.0" }, "bin": { "which": "bin/which" } }, "node_modules/execa/node_modules/yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", "dev": true }, "node_modules/executable": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", "dev": true, "dependencies": { "pify": "^2.2.0" }, "engines": { "node": ">=4" } }, "node_modules/executable/node_modules/pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/ext-list": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", "dev": true, "dependencies": { "mime-db": "^1.28.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/ext-name": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", "dev": true, "dependencies": { "ext-list": "^2.0.0", "sort-keys-length": "^1.0.0" }, "engines": { "node": ">=4" } }, "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 }, "node_modules/extract-zip": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", "dev": true, "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", "yauzl": "^2.10.0" }, "bin": { "extract-zip": "cli.js" }, "engines": { "node": ">= 10.17.0" }, "optionalDependencies": { "@types/yauzl": "^2.9.1" } }, "node_modules/extract-zip/node_modules/get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, "dependencies": { "pump": "^3.0.0" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", "dev": true, "engines": [ "node >=0.6.0" ] }, "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 }, "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 }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, "node_modules/fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, "dependencies": { "reusify": "^1.0.4" } }, "node_modules/fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", "dev": true, "dependencies": { "pend": "~1.2.0" } }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "dependencies": { "flat-cache": "^3.0.4" }, "engines": { "node": "^10.12.0 || >=12.0.0" } }, "node_modules/file-type": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-8.1.0.tgz", "integrity": "sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/filename-reserved-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/filenamify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-2.1.0.tgz", "integrity": "sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==", "dev": true, "dependencies": { "filename-reserved-regex": "^2.0.0", "strip-outer": "^1.0.0", "trim-repeated": "^1.0.0" }, "engines": { "node": ">=4" } }, "node_modules/filesize": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.4.0.tgz", "integrity": "sha512-mjFIpOHC4jbfcTfoh4rkWpI31mF7viw9ikj/JyLoKzqlwG/YsefKfvYlYhdYdg/9mtK2z1AzgN/0LvVQ3zdlSQ==", "dev": true, "engines": { "node": ">= 0.4.0" } }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/finalhandler": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "dev": true, "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "on-finished": "~2.3.0", "parseurl": "~1.3.3", "statuses": "~1.5.0", "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8" } }, "node_modules/finalhandler/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "dependencies": { "ms": "2.0.0" } }, "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, "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, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/find-versions": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", "dev": true, "dependencies": { "semver-regex": "^2.0.0" }, "engines": { "node": ">=6" } }, "node_modules/flat-cache": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { "node": "^10.12.0 || >=12.0.0" } }, "node_modules/flatted": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, "node_modules/follow-redirects": { "version": "1.15.2", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "dev": true, "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], "engines": { "node": ">=4.0" }, "peerDependenciesMeta": { "debug": { "optional": true } } }, "node_modules/fontkit": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fontkit/-/fontkit-2.0.2.tgz", "integrity": "sha512-jc4k5Yr8iov8QfS6u8w2CnHWVmbOGtdBtOXMze5Y+QD966Rx6PEVWXSEGwXlsDlKtu1G12cJjcsybnqhSk/+LA==", "dev": true, "dependencies": { "@swc/helpers": "^0.4.2", "brotli": "^1.3.2", "clone": "^2.1.2", "dfa": "^1.2.0", "fast-deep-equal": "^3.1.3", "restructure": "^3.0.0", "tiny-inflate": "^1.0.3", "unicode-properties": "^1.4.0", "unicode-trie": "^2.0.0" } }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, "peer": true, "dependencies": { "is-callable": "^1.1.3" } }, "node_modules/foreground-child": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", "dev": true, "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" }, "engines": { "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/foreground-child/node_modules/signal-exit": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", "dev": true, "engines": { "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", "dev": true, "engines": { "node": "*" } }, "node_modules/form-data": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", "mime-types": "^2.1.12" }, "engines": { "node": ">= 0.12" } }, "node_modules/from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", "dev": true, "dependencies": { "inherits": "^2.0.1", "readable-stream": "^2.0.0" } }, "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", "dev": true }, "node_modules/fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" }, "engines": { "node": ">=6 <7 || >=8" } }, "node_modules/fs-minipass": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.2.tgz", "integrity": "sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g==", "dev": true, "dependencies": { "minipass": "^5.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "hasInstallScript": true, "optional": true, "os": [ "darwin" ], "engines": { "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, "node_modules/function.prototype.name": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", "dev": true, "peer": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", "es-abstract": "^1.19.0", "functions-have-names": "^1.2.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/gauge": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", "dev": true, "dependencies": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.3", "console-control-strings": "^1.1.0", "has-unicode": "^2.0.1", "signal-exit": "^3.0.7", "string-width": "^4.2.3", "strip-ansi": "^6.0.1", "wide-align": "^1.1.5" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-intrinsic": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dev": true, "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", "has-proto": "^1.0.1", "has-symbols": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-port": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", "dev": true, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/get-proxy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz", "integrity": "sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==", "dev": true, "dependencies": { "npm-conf": "^1.1.0" }, "engines": { "node": ">=4" } }, "node_modules/get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "dev": true, "peer": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-uri": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.1.tgz", "integrity": "sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q==", "dev": true, "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^5.0.1", "debug": "^4.3.4", "fs-extra": "^8.1.0" }, "engines": { "node": ">= 14" } }, "node_modules/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "dependencies": { "assert-plus": "^1.0.0" } }, "node_modules/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "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/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "dependencies": { "is-glob": "^4.0.1" }, "engines": { "node": ">= 6" } }, "node_modules/global-agent": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-2.2.0.tgz", "integrity": "sha512-+20KpaW6DDLqhG7JDiJpD1JvNvb8ts+TNl7BPOYcURqCrXqnN1Vf+XVOrkKJAFPqfX+oEhsdzOj1hLWkBTdNJg==", "dev": true, "dependencies": { "boolean": "^3.0.1", "core-js": "^3.6.5", "es6-error": "^4.1.1", "matcher": "^3.0.0", "roarr": "^2.15.3", "semver": "^7.3.2", "serialize-error": "^7.0.1" }, "engines": { "node": ">=10.0" } }, "node_modules/global-agent/node_modules/semver": { "version": "7.5.1", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/globalthis": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "dev": true, "dependencies": { "define-properties": "^1.1.3" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, "peer": true, "dependencies": { "get-intrinsic": "^1.1.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/got": { "version": "11.8.6", "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", "dev": true, "dependencies": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", "@types/cacheable-request": "^6.0.1", "@types/responselike": "^1.0.0", "cacheable-lookup": "^5.0.3", "cacheable-request": "^7.0.2", "decompress-response": "^6.0.0", "http2-wrapper": "^1.0.0-beta.5.2", "lowercase-keys": "^2.0.0", "p-cancelable": "^2.0.0", "responselike": "^2.0.0" }, "engines": { "node": ">=10.19.0" }, "funding": { "url": "https://github.com/sindresorhus/got?sponsor=1" } }, "node_modules/graceful-fs": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", "dev": true }, "node_modules/grapheme-splitter": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, "node_modules/gzip-size": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", "dev": true, "dependencies": { "duplexer": "^0.1.2" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/gzip-size/node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, "node_modules/har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", "dev": true, "engines": { "node": ">=4" } }, "node_modules/har-validator": { "version": "5.1.5", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "deprecated": "this library is no longer supported", "dev": true, "dependencies": { "ajv": "^6.12.3", "har-schema": "^2.0.0" }, "engines": { "node": ">=6" } }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "dependencies": { "function-bind": "^1.1.1" }, "engines": { "node": ">= 0.4.0" } }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/has-property-descriptors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", "dev": true, "dependencies": { "get-intrinsic": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", "dev": true, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-symbol-support-x": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", "dev": true, "engines": { "node": "*" } }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-to-string-tag-x": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", "dev": true, "dependencies": { "has-symbol-support-x": "^1.4.1" }, "engines": { "node": "*" } }, "node_modules/has-tostringtag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dev": true, "peer": true, "dependencies": { "has-symbols": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "dev": true }, "node_modules/hash.js": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" } }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, "bin": { "he": "bin/he" } }, "node_modules/header-case": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", "dev": true, "dependencies": { "capital-case": "^1.0.4", "tslib": "^2.0.3" } }, "node_modules/hosted-git-info": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", "dev": true, "dependencies": { "lru-cache": "^7.5.1" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/hosted-git-info/node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, "engines": { "node": ">=12" } }, "node_modules/html-encoding-sniffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", "dev": true, "dependencies": { "whatwg-encoding": "^2.0.0" }, "engines": { "node": ">=12" } }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, "node_modules/http-cache-semantics": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", "dev": true }, "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==", "dev": true, "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/http-errors/node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, "engines": { "node": ">= 0.8" } }, "node_modules/http-proxy": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", "requires-port": "^1.0.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/http-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "dev": true, "dependencies": { "@tootallnate/once": "2", "agent-base": "6", "debug": "4" }, "engines": { "node": ">= 6" } }, "node_modules/http-server": { "version": "14.1.1", "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", "dev": true, "dependencies": { "basic-auth": "^2.0.1", "chalk": "^4.1.2", "corser": "^2.0.1", "he": "^1.2.0", "html-encoding-sniffer": "^3.0.0", "http-proxy": "^1.18.1", "mime": "^1.6.0", "minimist": "^1.2.6", "opener": "^1.5.1", "portfinder": "^1.0.28", "secure-compare": "3.0.1", "union": "~0.5.0", "url-join": "^4.0.1" }, "bin": { "http-server": "bin/http-server" }, "engines": { "node": ">=12" } }, "node_modules/http-server/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, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/http-server/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, "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/http-server/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, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/http-server/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 }, "node_modules/http-server/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, "engines": { "node": ">=8" } }, "node_modules/http-server/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, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", "sshpk": "^1.7.0" }, "engines": { "node": ">=0.8", "npm": ">=1.3.7" } }, "node_modules/http2-wrapper": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", "dev": true, "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.0.0" }, "engines": { "node": ">=10.19.0" } }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, "dependencies": { "agent-base": "6", "debug": "4" }, "engines": { "node": ">= 6" } }, "node_modules/humanize-ms": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "dev": true, "dependencies": { "ms": "^2.0.0" } }, "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==", "dev": true, "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==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/feross" }, { "type": "patreon", "url": "https://www.patreon.com/feross" }, { "type": "consulting", "url": "https://feross.org/support" } ] }, "node_modules/ignore": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true, "engines": { "node": ">= 4" } }, "node_modules/ignore-walk": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.3.tgz", "integrity": "sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==", "dev": true, "dependencies": { "minimatch": "^9.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/ignore-walk/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==", "dev": true, "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/ignore-walk/node_modules/minimatch": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/image-size": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz", "integrity": "sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==", "dev": true, "dependencies": { "queue": "6.0.2" }, "bin": { "image-size": "bin/image-size.js" }, "engines": { "node": ">=14.0.0" } }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/import-lazy": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-3.1.0.tgz", "integrity": "sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true, "engines": { "node": ">=0.8.19" } }, "node_modules/indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/infer-owner": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", "dev": true }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "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==", "dev": true }, "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 }, "node_modules/internal-slot": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "dev": true, "peer": true, "dependencies": { "get-intrinsic": "^1.2.0", "has": "^1.0.3", "side-channel": "^1.0.4" }, "engines": { "node": ">= 0.4" } }, "node_modules/into-stream": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", "integrity": "sha512-TcdjPibTksa1NQximqep2r17ISRiNE9fwlfbg3F8ANdvP5/yrFTew86VcO//jk4QTaMlbjypPBq76HN2zaKfZQ==", "dev": true, "dependencies": { "from2": "^2.1.1", "p-is-promise": "^1.1.0" }, "engines": { "node": ">=4" } }, "node_modules/ip": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", "dev": true }, "node_modules/is-array-buffer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", "dev": true, "peer": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.0", "is-typed-array": "^1.1.10" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, "peer": true, "dependencies": { "has-bigints": "^1.0.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "dependencies": { "binary-extensions": "^2.0.0" }, "engines": { "node": ">=8" } }, "node_modules/is-boolean-object": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, "peer": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-builtin-module": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", "dev": true, "dependencies": { "builtin-modules": "^3.3.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, "peer": true, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-core-module": { "version": "2.12.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", "dev": true, "dependencies": { "has": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, "peer": true, "dependencies": { "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, "bin": { "is-docker": "cli.js" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true, "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==", "dev": true, "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==", "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/is-lambda": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", "dev": true }, "node_modules/is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", "dev": true }, "node_modules/is-natural-number": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", "integrity": "sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==", "dev": true }, "node_modules/is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true, "peer": true, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "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==", "dev": true, "engines": { "node": ">=0.12.0" } }, "node_modules/is-number-object": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, "peer": true, "dependencies": { "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-object": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/is-reference": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", "dev": true, "dependencies": { "@types/estree": "*" } }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, "peer": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-retry-allowed": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/is-shared-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", "dev": true, "peer": true, "dependencies": { "call-bind": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/is-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, "peer": true, "dependencies": { "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-symbol": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, "peer": true, "dependencies": { "has-symbols": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-typed-array": { "version": "1.1.10", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", "dev": true, "peer": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, "peer": true, "dependencies": { "call-bind": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, "dependencies": { "is-docker": "^2.0.0" }, "engines": { "node": ">=8" } }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "node_modules/isbinaryfile": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz", "integrity": "sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w==", "dev": true, "engines": { "node": ">= 8.0.0" }, "funding": { "url": "https://github.com/sponsors/gjtorikian/" } }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, "node_modules/isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, "node_modules/istanbul-lib-coverage": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-instrument": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.2.0", "semver": "^6.3.0" }, "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-report": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dev": true, "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^3.0.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-report/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, "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-report/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, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" }, "engines": { "node": ">=10" } }, "node_modules/istanbul-lib-source-maps/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==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/istanbul-reports": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.5.tgz", "integrity": "sha512-5+19PlhnGabNWB7kOFnuxT8H3T/iIyQzIbQMxXsURmmvKg86P2sbkrGOT77VnHw0Qr0gc2XzRaRfMZYYbSQCJQ==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/isurl": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", "dev": true, "dependencies": { "has-to-string-tag-x": "^1.2.0", "is-object": "^1.0.1" }, "engines": { "node": ">= 4" } }, "node_modules/jackspeak": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.1.tgz", "integrity": "sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw==", "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, "engines": { "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/isaacs" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "node_modules/jasmine": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-5.1.0.tgz", "integrity": "sha512-prmJlC1dbLhti4nE4XAPDWmfJesYO15sjGXVp7Cs7Ym5I9Xtwa/hUHxxJXjnpfLO72+ySttA0Ztf8g/RiVnUKw==", "dev": true, "dependencies": { "glob": "^10.2.2", "jasmine-core": "~5.1.0" }, "bin": { "jasmine": "bin/jasmine.js" } }, "node_modules/jasmine-core": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.1.2.tgz", "integrity": "sha512-2oIUMGn00FdUiqz6epiiJr7xcFyNYj3rDcfmnzfkBnHyBQ3cBQUs4mmyGsOb7TTLb9kxk7dBcmEmqhDKkBoDyA==", "dev": true }, "node_modules/jasmine/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==", "dev": true, "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/jasmine/node_modules/glob": { "version": "10.2.7", "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.7.tgz", "integrity": "sha512-jTKehsravOJo8IJxUGfZILnkvVJM/MOfHRs8QcXolVef2zNI9Tqyy5+SeuOAZd3upViEZQLyFpQhYiHLrMUNmA==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.0.3", "minimatch": "^9.0.1", "minipass": "^5.0.0 || ^6.0.2", "path-scurry": "^1.7.0" }, "bin": { "glob": "dist/cjs/src/bin.js" }, "engines": { "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/jasmine/node_modules/minimatch": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, "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, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "node_modules/jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true, "bin": { "jsesc": "bin/jsesc" }, "engines": { "node": ">=4" } }, "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 }, "node_modules/json-parse-even-better-errors": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "dev": true }, "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 }, "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": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "bin": { "json5": "lib/cli.js" }, "engines": { "node": ">=6" } }, "node_modules/jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "dev": true, "engines": [ "node >= 0.2.0" ] }, "node_modules/jsprim": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dev": true, "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", "json-schema": "0.4.0", "verror": "1.10.0" }, "engines": { "node": ">=0.6.0" } }, "node_modules/karma": { "version": "6.4.3", "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.3.tgz", "integrity": "sha512-LuucC/RE92tJ8mlCwqEoRWXP38UMAqpnq98vktmS9SznSoUPPUJQbc91dHcxcunROvfQjdORVA/YFviH+Xci9Q==", "dev": true, "dependencies": { "@colors/colors": "1.5.0", "body-parser": "^1.19.0", "braces": "^3.0.2", "chokidar": "^3.5.1", "connect": "^3.7.0", "di": "^0.0.1", "dom-serialize": "^2.2.1", "glob": "^7.1.7", "graceful-fs": "^4.2.6", "http-proxy": "^1.18.1", "isbinaryfile": "^4.0.8", "lodash": "^4.17.21", "log4js": "^6.4.1", "mime": "^2.5.2", "minimatch": "^3.0.4", "mkdirp": "^0.5.5", "qjobs": "^1.2.0", "range-parser": "^1.2.1", "rimraf": "^3.0.2", "socket.io": "^4.7.2", "source-map": "^0.6.1", "tmp": "^0.2.1", "ua-parser-js": "^0.7.30", "yargs": "^16.1.1" }, "bin": { "karma": "bin/karma" }, "engines": { "node": ">= 10" } }, "node_modules/karma-chrome-launcher": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz", "integrity": "sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==", "dev": true, "dependencies": { "which": "^1.2.1" } }, "node_modules/karma-chrome-launcher/node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "dependencies": { "isexe": "^2.0.0" }, "bin": { "which": "bin/which" } }, "node_modules/karma-coverage": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.2.1.tgz", "integrity": "sha512-yj7hbequkQP2qOSb20GuNSIyE//PgJWHwC2IydLE6XRtsnaflv+/OSGNssPjobYUlhVVagy99TQpqUt3vAUG7A==", "dev": true, "dependencies": { "istanbul-lib-coverage": "^3.2.0", "istanbul-lib-instrument": "^5.1.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.1", "istanbul-reports": "^3.0.5", "minimatch": "^3.0.4" }, "engines": { "node": ">=10.0.0" } }, "node_modules/karma-firefox-launcher": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-2.1.3.tgz", "integrity": "sha512-LMM2bseebLbYjODBOVt7TCPP9OI2vZIXCavIXhkO9m+10Uj5l7u/SKoeRmYx8FYHTVGZSpk6peX+3BMHC1WwNw==", "dev": true, "dependencies": { "is-wsl": "^2.2.0", "which": "^3.0.0" } }, "node_modules/karma-firefox-launcher/node_modules/which": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", "dev": true, "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/which.js" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/karma-jasmine": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz", "integrity": "sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==", "dev": true, "dependencies": { "jasmine-core": "^4.1.0" }, "engines": { "node": ">=12" }, "peerDependencies": { "karma": "^6.0.0" } }, "node_modules/karma-jasmine/node_modules/jasmine-core": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.6.0.tgz", "integrity": "sha512-O236+gd0ZXS8YAjFx8xKaJ94/erqUliEkJTDedyE7iHvv4ZVqi+q+8acJxu05/WJDKm512EUNn809In37nWlAQ==", "dev": true }, "node_modules/karma-sauce-launcher": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/karma-sauce-launcher/-/karma-sauce-launcher-4.3.6.tgz", "integrity": "sha512-Ej62q4mUPFktyAm8g0g8J5qhwEkXwdHrwtiV4pZjKNHNnSs+4qgDyzs3VkpOy3AmNTsTqQXUN/lpiy0tZpDJZQ==", "dev": true, "dependencies": { "global-agent": "^2.1.12", "saucelabs": "^4.6.3", "webdriverio": "^6.7.0" }, "engines": { "node": ">= 10.0.0" } }, "node_modules/karma/node_modules/mime": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", "dev": true, "bin": { "mime": "cli.js" }, "engines": { "node": ">=4.0.0" } }, "node_modules/karma/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==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/karma/node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.0", "y18n": "^5.0.5", "yargs-parser": "^20.2.2" }, "engines": { "node": ">=10" } }, "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, "dependencies": { "json-buffer": "3.0.1" } }, "node_modules/lazystream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", "dev": true, "dependencies": { "readable-stream": "^2.0.5" }, "engines": { "node": ">= 0.6.3" } }, "node_modules/lcov-parse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-1.0.0.tgz", "integrity": "sha1-6w1GtUER68VhrLTECO+TY73I9+A=", "dev": true, "bin": { "lcov-parse": "bin/cli.js" } }, "node_modules/legacy-swc-helpers": { "name": "@swc/helpers", "version": "0.4.14", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.14.tgz", "integrity": "sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==", "dev": true, "dependencies": { "tslib": "^2.4.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, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/lighthouse-logger": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", "dev": true, "dependencies": { "debug": "^2.6.9", "marky": "^1.2.2" } }, "node_modules/lighthouse-logger/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "dependencies": { "ms": "2.0.0" } }, "node_modules/lighthouse-logger/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, "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, "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==", "dev": true }, "node_modules/lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", "dev": true }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, "node_modules/lodash.defaults": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", "dev": true }, "node_modules/lodash.difference": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", "dev": true }, "node_modules/lodash.flatten": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", "dev": true }, "node_modules/lodash.isobject": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", "integrity": "sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA==", "dev": true }, "node_modules/lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", "dev": true }, "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 }, "node_modules/lodash.union": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", "dev": true }, "node_modules/lodash.zip": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", "integrity": "sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==", "dev": true }, "node_modules/log-driver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", "dev": true, "engines": { "node": ">=0.8.6" } }, "node_modules/log4js": { "version": "6.9.1", "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", "dev": true, "dependencies": { "date-format": "^4.0.14", "debug": "^4.3.4", "flatted": "^3.2.7", "rfdc": "^1.3.0", "streamroller": "^3.1.5" }, "engines": { "node": ">=8.0" } }, "node_modules/loglevel": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz", "integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==", "dev": true, "engines": { "node": ">= 0.6.0" }, "funding": { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/loglevel" } }, "node_modules/loglevel-plugin-prefix": { "version": "0.8.4", "resolved": "https://registry.npmjs.org/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz", "integrity": "sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==", "dev": true }, "node_modules/lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", "dev": true, "dependencies": { "tslib": "^2.0.3" } }, "node_modules/lowercase-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=10" } }, "node_modules/magic-string": { "version": "0.30.10", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "dependencies": { "semver": "^6.0.0" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/make-fetch-happen": { "version": "10.2.1", "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", "dev": true, "dependencies": { "agentkeepalive": "^4.2.1", "cacache": "^16.1.0", "http-cache-semantics": "^4.1.0", "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.0", "is-lambda": "^1.0.1", "lru-cache": "^7.7.1", "minipass": "^3.1.6", "minipass-collect": "^1.0.2", "minipass-fetch": "^2.0.3", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.3", "promise-retry": "^2.0.1", "socks-proxy-agent": "^7.0.0", "ssri": "^9.0.0" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/make-fetch-happen/node_modules/@npmcli/fs": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", "dev": true, "dependencies": { "@gar/promisify": "^1.1.3", "semver": "^7.3.5" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/make-fetch-happen/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==", "dev": true, "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/make-fetch-happen/node_modules/cacache": { "version": "16.1.3", "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", "dev": true, "dependencies": { "@npmcli/fs": "^2.1.0", "@npmcli/move-file": "^2.0.0", "chownr": "^2.0.0", "fs-minipass": "^2.1.0", "glob": "^8.0.1", "infer-owner": "^1.0.4", "lru-cache": "^7.7.1", "minipass": "^3.1.6", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "mkdirp": "^1.0.4", "p-map": "^4.0.0", "promise-inflight": "^1.0.1", "rimraf": "^3.0.2", "ssri": "^9.0.0", "tar": "^6.1.11", "unique-filename": "^2.0.0" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/make-fetch-happen/node_modules/chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true, "engines": { "node": ">=10" } }, "node_modules/make-fetch-happen/node_modules/fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dev": true, "dependencies": { "minipass": "^3.0.0" }, "engines": { "node": ">= 8" } }, "node_modules/make-fetch-happen/node_modules/glob": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^5.0.1", "once": "^1.3.0" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/make-fetch-happen/node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, "engines": { "node": ">=12" } }, "node_modules/make-fetch-happen/node_modules/minimatch": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { "node": ">=10" } }, "node_modules/make-fetch-happen/node_modules/minipass": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/make-fetch-happen/node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, "bin": { "mkdirp": "bin/cmd.js" }, "engines": { "node": ">=10" } }, "node_modules/make-fetch-happen/node_modules/semver": { "version": "7.5.1", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/make-fetch-happen/node_modules/semver/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=10" } }, "node_modules/make-fetch-happen/node_modules/ssri": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", "dev": true, "dependencies": { "minipass": "^3.1.1" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/make-fetch-happen/node_modules/unique-filename": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", "dev": true, "dependencies": { "unique-slug": "^3.0.0" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/make-fetch-happen/node_modules/unique-slug": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", "dev": true, "dependencies": { "imurmurhash": "^0.1.4" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/marky": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz", "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==", "dev": true }, "node_modules/matcher": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", "dev": true, "dependencies": { "escape-string-regexp": "^4.0.0" }, "engines": { "node": ">=10" } }, "node_modules/matcher/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, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, "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==", "dev": true, "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==", "dev": true, "dependencies": { "mime-db": "1.52.0" }, "engines": { "node": ">= 0.6" } }, "node_modules/mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "dev": true }, "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, "dependencies": { "brace-expansion": "^1.1.7" }, "engines": { "node": "*" } }, "node_modules/minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/minipass": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/minipass-collect": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", "dev": true, "dependencies": { "minipass": "^3.0.0" }, "engines": { "node": ">= 8" } }, "node_modules/minipass-collect/node_modules/minipass": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/minipass-fetch": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", "dev": true, "dependencies": { "minipass": "^3.1.6", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" }, "optionalDependencies": { "encoding": "^0.1.13" } }, "node_modules/minipass-fetch/node_modules/minipass": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/minipass-flush": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "dev": true, "dependencies": { "minipass": "^3.0.0" }, "engines": { "node": ">= 8" } }, "node_modules/minipass-flush/node_modules/minipass": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/minipass-json-stream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", "dev": true, "dependencies": { "jsonparse": "^1.3.1", "minipass": "^3.0.0" } }, "node_modules/minipass-json-stream/node_modules/minipass": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/minipass-pipeline": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "dev": true, "dependencies": { "minipass": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/minipass-pipeline/node_modules/minipass": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/minipass-sized": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", "dev": true, "dependencies": { "minipass": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/minipass-sized/node_modules/minipass": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/minizlib": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dev": true, "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" }, "engines": { "node": ">= 8" } }, "node_modules/minizlib/node_modules/minipass": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/mitt": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz", "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==", "dev": true }, "node_modules/mkdirp": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "dependencies": { "minimist": "^1.2.5" }, "bin": { "mkdirp": "bin/cmd.js" } }, "node_modules/mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", "dev": true }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, "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==", "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/netmask": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", "dev": true, "engines": { "node": ">= 0.4.0" } }, "node_modules/nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, "node_modules/no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "dev": true, "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" } }, "node_modules/node-fetch": { "version": "2.6.11", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", "dev": true, "dependencies": { "whatwg-url": "^5.0.0" }, "engines": { "node": "4.x || >=6.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "peerDependenciesMeta": { "encoding": { "optional": true } } }, "node_modules/node-gyp": { "version": "9.3.1", "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.1.tgz", "integrity": "sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg==", "dev": true, "dependencies": { "env-paths": "^2.2.0", "glob": "^7.1.4", "graceful-fs": "^4.2.6", "make-fetch-happen": "^10.0.3", "nopt": "^6.0.0", "npmlog": "^6.0.0", "rimraf": "^3.0.2", "semver": "^7.3.5", "tar": "^6.1.2", "which": "^2.0.2" }, "bin": { "node-gyp": "bin/node-gyp.js" }, "engines": { "node": "^12.13 || ^14.13 || >=16" } }, "node_modules/node-gyp/node_modules/semver": { "version": "7.5.1", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/node-releases": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, "node_modules/nopt": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", "dev": true, "dependencies": { "abbrev": "^1.0.0" }, "bin": { "nopt": "bin/nopt.js" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/normalize-package-data": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", "dev": true, "dependencies": { "hosted-git-info": "^6.0.0", "is-core-module": "^2.8.1", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/normalize-package-data/node_modules/semver": { "version": "7.5.1", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "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==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/normalize-url": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/npm-bundled": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", "dev": true, "dependencies": { "npm-normalize-package-bin": "^3.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm-conf": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", "dev": true, "dependencies": { "config-chain": "^1.1.11", "pify": "^3.0.0" }, "engines": { "node": ">=4" } }, "node_modules/npm-conf/node_modules/pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/npm-install-checks": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.1.1.tgz", "integrity": "sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw==", "dev": true, "dependencies": { "semver": "^7.1.1" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm-install-checks/node_modules/semver": { "version": "7.5.1", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/npm-normalize-package-bin": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm-package-arg": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", "dev": true, "dependencies": { "hosted-git-info": "^6.0.0", "proc-log": "^3.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^5.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm-package-arg/node_modules/semver": { "version": "7.5.1", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/npm-packlist": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", "dev": true, "dependencies": { "ignore-walk": "^6.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm-pick-manifest": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz", "integrity": "sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==", "dev": true, "dependencies": { "npm-install-checks": "^6.0.0", "npm-normalize-package-bin": "^3.0.0", "npm-package-arg": "^10.0.0", "semver": "^7.3.5" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm-pick-manifest/node_modules/semver": { "version": "7.5.1", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/npm-registry-fetch": { "version": "14.0.5", "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", "dev": true, "dependencies": { "make-fetch-happen": "^11.0.0", "minipass": "^5.0.0", "minipass-fetch": "^3.0.0", "minipass-json-stream": "^1.0.1", "minizlib": "^2.1.2", "npm-package-arg": "^10.0.0", "proc-log": "^3.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm-registry-fetch/node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, "engines": { "node": ">=12" } }, "node_modules/npm-registry-fetch/node_modules/make-fetch-happen": { "version": "11.1.1", "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", "dev": true, "dependencies": { "agentkeepalive": "^4.2.1", "cacache": "^17.0.0", "http-cache-semantics": "^4.1.1", "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.0", "is-lambda": "^1.0.1", "lru-cache": "^7.7.1", "minipass": "^5.0.0", "minipass-fetch": "^3.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.3", "promise-retry": "^2.0.1", "socks-proxy-agent": "^7.0.0", "ssri": "^10.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm-registry-fetch/node_modules/minipass-fetch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", "dev": true, "dependencies": { "minipass": "^5.0.0", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" }, "optionalDependencies": { "encoding": "^0.1.13" } }, "node_modules/npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", "dev": true, "dependencies": { "path-key": "^2.0.0" }, "engines": { "node": ">=4" } }, "node_modules/npm-run-path/node_modules/path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/npmlog": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", "dev": true, "dependencies": { "are-we-there-yet": "^3.0.0", "console-control-strings": "^1.1.0", "gauge": "^4.0.3", "set-blocking": "^2.0.0" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true, "engines": { "node": "*" } }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, "engines": { "node": ">= 0.4" } }, "node_modules/object.assign": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, "peer": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.values": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", "dev": true, "peer": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", "dev": true, "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": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "dependencies": { "wrappy": "1" } }, "node_modules/opener": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", "dev": true, "bin": { "opener": "bin/opener-bin.js" } }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "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-filter-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/os-filter-obj/-/os-filter-obj-2.0.0.tgz", "integrity": "sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg==", "dev": true, "dependencies": { "arch": "^2.1.0" }, "engines": { "node": ">=4" } }, "node_modules/p-cancelable": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/p-event": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.3.1.tgz", "integrity": "sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==", "dev": true, "dependencies": { "p-timeout": "^2.0.1" }, "engines": { "node": ">=6" } }, "node_modules/p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/p-is-promise": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", "integrity": "sha512-zL7VE4JVS2IFSkR2GQKDSPEVxkoH43/p7oEnwpdCndKYJO0HVeRB7fA8TJwuLOTBREtK0ea8eHaxdwcpob5dmg==", "dev": true, "engines": { "node": ">=4" } }, "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, "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, "dependencies": { "p-limit": "^3.0.2" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-map": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, "dependencies": { "aggregate-error": "^3.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-timeout": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", "dev": true, "dependencies": { "p-finally": "^1.0.0" }, "engines": { "node": ">=4" } }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/pac-proxy-agent": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-6.0.3.tgz", "integrity": "sha512-5Hr1KgPDoc21Vn3rsXBirwwDnF/iac1jN/zkpsOYruyT+ZgsUhUOgVwq3v9+ukjZd/yGm/0nzO1fDfl7rkGoHQ==", "dev": true, "dependencies": { "agent-base": "^7.0.2", "debug": "^4.3.4", "get-uri": "^6.0.1", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.0", "pac-resolver": "^6.0.1", "socks-proxy-agent": "^8.0.1" }, "engines": { "node": ">= 14" } }, "node_modules/pac-proxy-agent/node_modules/agent-base": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", "dev": true, "dependencies": { "debug": "^4.3.4" }, "engines": { "node": ">= 14" } }, "node_modules/pac-proxy-agent/node_modules/http-proxy-agent": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", "dev": true, "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" }, "engines": { "node": ">= 14" } }, "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.0.tgz", "integrity": "sha512-0euwPCRyAPSgGdzD1IVN9nJYHtBhJwb6XPfbpQcYbPCwrBidX6GzxmchnaF4sfF/jPb74Ojx5g4yTg3sixlyPw==", "dev": true, "dependencies": { "agent-base": "^7.0.2", "debug": "4" }, "engines": { "node": ">= 14" } }, "node_modules/pac-proxy-agent/node_modules/socks-proxy-agent": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.1.tgz", "integrity": "sha512-59EjPbbgg8U3x62hhKOFVAmySQUcfRQ4C7Q/D5sEHnZTQRrQlNKINks44DMR1gwXp0p4LaVIeccX2KHTTcHVqQ==", "dev": true, "dependencies": { "agent-base": "^7.0.1", "debug": "^4.3.4", "socks": "^2.7.1" }, "engines": { "node": ">= 14" } }, "node_modules/pac-resolver": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-6.0.1.tgz", "integrity": "sha512-dg497MhVT7jZegPRuOScQ/z0aV/5WR0gTdRu1md+Irs9J9o+ls5jIuxjo1WfaTG+eQQkxyn5HMGvWK+w7EIBkQ==", "dev": true, "dependencies": { "degenerator": "^4.0.1", "ip": "^1.1.5", "netmask": "^2.0.2" }, "engines": { "node": ">= 14" } }, "node_modules/pac-resolver/node_modules/ip": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", "dev": true }, "node_modules/pacote": { "version": "15.2.0", "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", "dev": true, "dependencies": { "@npmcli/git": "^4.0.0", "@npmcli/installed-package-contents": "^2.0.1", "@npmcli/promise-spawn": "^6.0.1", "@npmcli/run-script": "^6.0.0", "cacache": "^17.0.0", "fs-minipass": "^3.0.0", "minipass": "^5.0.0", "npm-package-arg": "^10.0.0", "npm-packlist": "^7.0.0", "npm-pick-manifest": "^8.0.0", "npm-registry-fetch": "^14.0.0", "proc-log": "^3.0.0", "promise-retry": "^2.0.1", "read-package-json": "^6.0.0", "read-package-json-fast": "^3.0.0", "sigstore": "^1.3.0", "ssri": "^10.0.0", "tar": "^6.1.11" }, "bin": { "pacote": "lib/bin.js" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/pako": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", "dev": true }, "node_modules/param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", "dev": true, "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "dependencies": { "callsites": "^3.0.0" }, "engines": { "node": ">=6" } }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/parse-json/node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true, "engines": { "node": ">= 0.8" } }, "node_modules/pascal-case": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", "dev": true, "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "node_modules/path-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", "dev": true, "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "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, "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": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true, "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==", "dev": true, "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 }, "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==", "dev": true, "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-scurry/node_modules/lru-cache": { "version": "10.2.2", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", "dev": true, "engines": { "node": "14 || >=16.14" } }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", "dev": true }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, "node_modules/picocolors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", "dev": true }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "engines": { "node": ">=8.6" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/pinkie-promise": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", "dev": true, "dependencies": { "pinkie": "^2.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "dependencies": { "find-up": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/pkg-dir/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/pkg-dir/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "dependencies": { "p-locate": "^4.1.0" }, "engines": { "node": ">=8" } }, "node_modules/pkg-dir/node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "dependencies": { "p-try": "^2.0.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/pkg-dir/node_modules/p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "dependencies": { "p-limit": "^2.2.0" }, "engines": { "node": ">=8" } }, "node_modules/portfinder": { "version": "1.0.28", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", "dev": true, "dependencies": { "async": "^2.6.2", "debug": "^3.1.1", "mkdirp": "^0.5.5" }, "engines": { "node": ">= 0.12.0" } }, "node_modules/portfinder/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "dependencies": { "ms": "^2.1.1" } }, "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, "engines": { "node": ">= 0.8.0" } }, "node_modules/prepend-http": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/prettier": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz", "integrity": "sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" }, "engines": { "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" } }, "node_modules/proc-log": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.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==", "dev": true }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true, "engines": { "node": ">=0.4.0" } }, "node_modules/promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", "dev": true }, "node_modules/promise-retry": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "dev": true, "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" }, "engines": { "node": ">=10" } }, "node_modules/proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", "dev": true }, "node_modules/proxy-agent": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.2.1.tgz", "integrity": "sha512-OIbBKlRAT+ycCm6wAYIzMwPejzRtjy8F3QiDX0eKOA3e4pe3U9F/IvzcHP42bmgQxVv97juG+J8/gx+JIeCX/Q==", "dev": true, "dependencies": { "agent-base": "^7.0.2", "debug": "^4.3.4", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.0", "lru-cache": "^7.14.1", "pac-proxy-agent": "^6.0.3", "proxy-from-env": "^1.1.0", "socks-proxy-agent": "^8.0.1" }, "engines": { "node": ">= 14" } }, "node_modules/proxy-agent/node_modules/agent-base": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", "dev": true, "dependencies": { "debug": "^4.3.4" }, "engines": { "node": ">= 14" } }, "node_modules/proxy-agent/node_modules/http-proxy-agent": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", "dev": true, "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" }, "engines": { "node": ">= 14" } }, "node_modules/proxy-agent/node_modules/https-proxy-agent": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.0.tgz", "integrity": "sha512-0euwPCRyAPSgGdzD1IVN9nJYHtBhJwb6XPfbpQcYbPCwrBidX6GzxmchnaF4sfF/jPb74Ojx5g4yTg3sixlyPw==", "dev": true, "dependencies": { "agent-base": "^7.0.2", "debug": "4" }, "engines": { "node": ">= 14" } }, "node_modules/proxy-agent/node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, "engines": { "node": ">=12" } }, "node_modules/proxy-agent/node_modules/socks-proxy-agent": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.1.tgz", "integrity": "sha512-59EjPbbgg8U3x62hhKOFVAmySQUcfRQ4C7Q/D5sEHnZTQRrQlNKINks44DMR1gwXp0p4LaVIeccX2KHTTcHVqQ==", "dev": true, "dependencies": { "agent-base": "^7.0.1", "debug": "^4.3.4", "socks": "^2.7.1" }, "engines": { "node": ">= 14" } }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "dev": true }, "node_modules/pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", "dev": true }, "node_modules/psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/puppeteer": { "version": "20.6.0", "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-20.6.0.tgz", "integrity": "sha512-D/kkEIpDFRqpLOcCoNNdXI+IUcoD1FmdlWteT4FFPOhNLC46urmItMfQDKSwk2NJoO38ncgCQe5XEQ3QHD+piA==", "dev": true, "hasInstallScript": true, "dependencies": { "@puppeteer/browsers": "1.4.1", "cosmiconfig": "8.2.0", "puppeteer-core": "20.6.0" }, "engines": { "node": ">=16.3.0" } }, "node_modules/puppeteer-core": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-5.5.0.tgz", "integrity": "sha512-tlA+1n+ziW/Db03hVV+bAecDKse8ihFRXYiEypBe9IlLRvOCzYFG6qrCMBYK34HO/Q/Ecjc+tvkHRAfLVH+NgQ==", "dev": true, "dependencies": { "debug": "^4.1.0", "devtools-protocol": "0.0.818844", "extract-zip": "^2.0.0", "https-proxy-agent": "^4.0.0", "node-fetch": "^2.6.1", "pkg-dir": "^4.2.0", "progress": "^2.0.1", "proxy-from-env": "^1.0.0", "rimraf": "^3.0.2", "tar-fs": "^2.0.0", "unbzip2-stream": "^1.3.3", "ws": "^7.2.3" }, "engines": { "node": ">=10.18.1" } }, "node_modules/puppeteer-core/node_modules/agent-base": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", "dev": true, "engines": { "node": ">= 6.0.0" } }, "node_modules/puppeteer-core/node_modules/https-proxy-agent": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", "dev": true, "dependencies": { "agent-base": "5", "debug": "4" }, "engines": { "node": ">= 6.0.0" } }, "node_modules/puppeteer-core/node_modules/ws": { "version": "7.5.9", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", "dev": true, "engines": { "node": ">=8.3.0" }, "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "peerDependenciesMeta": { "bufferutil": { "optional": true }, "utf-8-validate": { "optional": true } } }, "node_modules/puppeteer/node_modules/devtools-protocol": { "version": "0.0.1135028", "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1135028.tgz", "integrity": "sha512-jEcNGrh6lOXNRJvZb9RjeevtZGrgugPKSMJZxfyxWQnhlKawMPhMtk/dfC+Z/6xNXExlzTKlY5LzIAK/fRpQIw==", "dev": true }, "node_modules/puppeteer/node_modules/puppeteer-core": { "version": "20.6.0", "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-20.6.0.tgz", "integrity": "sha512-vUE6VnqvOHX1ABssTxtzTJUzEJrTL49DmXflSvlRIcolzOISVni1niI5/oWsDxzyRVE9sfwe8QqFbsWozs5RPA==", "dev": true, "dependencies": { "@puppeteer/browsers": "1.4.1", "chromium-bidi": "0.4.11", "cross-fetch": "3.1.6", "debug": "4.3.4", "devtools-protocol": "0.0.1135028", "ws": "8.13.0" }, "engines": { "node": ">=16.3.0" }, "peerDependencies": { "typescript": ">= 4.7.4" }, "peerDependenciesMeta": { "typescript": { "optional": true } } }, "node_modules/puppeteer/node_modules/ws": { "version": "8.13.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", "dev": true, "engines": { "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { "optional": true }, "utf-8-validate": { "optional": true } } }, "node_modules/qjobs": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", "dev": true, "engines": { "node": ">=0.9" } }, "node_modules/qs": { "version": "6.5.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "dev": true, "engines": { "node": ">=0.6" } }, "node_modules/query-string": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", "dev": true, "dependencies": { "decode-uri-component": "^0.2.0", "object-assign": "^4.1.0", "strict-uri-encode": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/queue": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", "dev": true, "dependencies": { "inherits": "~2.0.3" } }, "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==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/feross" }, { "type": "patreon", "url": "https://www.patreon.com/feross" }, { "type": "consulting", "url": "https://feross.org/support" } ] }, "node_modules/quick-lru": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "dependencies": { "safe-buffer": "^5.1.0" } }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true, "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==", "dev": true, "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/read-package-json": { "version": "6.0.4", "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", "dev": true, "dependencies": { "glob": "^10.2.2", "json-parse-even-better-errors": "^3.0.0", "normalize-package-data": "^5.0.0", "npm-normalize-package-bin": "^3.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/read-package-json-fast": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", "dev": true, "dependencies": { "json-parse-even-better-errors": "^3.0.0", "npm-normalize-package-bin": "^3.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/read-package-json/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==", "dev": true, "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/read-package-json/node_modules/glob": { "version": "10.2.7", "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.7.tgz", "integrity": "sha512-jTKehsravOJo8IJxUGfZILnkvVJM/MOfHRs8QcXolVef2zNI9Tqyy5+SeuOAZd3upViEZQLyFpQhYiHLrMUNmA==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.0.3", "minimatch": "^9.0.1", "minipass": "^5.0.0 || ^6.0.2", "path-scurry": "^1.7.0" }, "bin": { "glob": "dist/cjs/src/bin.js" }, "engines": { "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/read-package-json/node_modules/minimatch": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "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/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==", "dev": true, "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==", "dev": true, "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==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { "node": ">=10" } }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "dependencies": { "picomatch": "^2.2.1" }, "engines": { "node": ">=8.10.0" } }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "dev": true }, "node_modules/regenerate-unicode-properties": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", "dev": true, "dependencies": { "regenerate": "^1.4.2" }, "engines": { "node": ">=4" } }, "node_modules/regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", "dev": true }, "node_modules/regenerator-transform": { "version": "0.15.2", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "dev": true, "dependencies": { "@babel/runtime": "^7.8.4" } }, "node_modules/regexp.prototype.flags": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dev": true, "peer": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/regexpu-core": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", "dev": true, "dependencies": { "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.1.0", "regjsparser": "^0.9.1", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" }, "engines": { "node": ">=4" } }, "node_modules/regjsparser": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "dev": true, "dependencies": { "jsesc": "~0.5.0" }, "bin": { "regjsparser": "bin/parser" } }, "node_modules/regjsparser/node_modules/jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", "dev": true, "bin": { "jsesc": "bin/jsesc" } }, "node_modules/request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", "dev": true, "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", "caseless": "~0.12.0", "combined-stream": "~1.0.6", "extend": "~3.0.2", "forever-agent": "~0.6.1", "form-data": "~2.3.2", "har-validator": "~5.1.3", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", "mime-types": "~2.1.19", "oauth-sign": "~0.9.0", "performance-now": "^2.1.0", "qs": "~6.5.2", "safe-buffer": "^5.1.2", "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" }, "engines": { "node": ">= 6" } }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", "dev": true }, "node_modules/resolve": { "version": "1.22.2", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dev": true, "dependencies": { "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/resolve-alpn": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", "dev": true }, "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, "engines": { "node": ">=4" } }, "node_modules/responselike": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", "dev": true, "dependencies": { "lowercase-keys": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/resq": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/resq/-/resq-1.11.0.tgz", "integrity": "sha512-G10EBz+zAAy3zUd/CDoBbXRL6ia9kOo3xRHrMDsHljI0GDkhYlyjwoCx5+3eCC4swi1uCoZQhskuJkj7Gp57Bw==", "dev": true, "dependencies": { "fast-deep-equal": "^2.0.1" } }, "node_modules/resq/node_modules/fast-deep-equal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", "integrity": "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==", "dev": true }, "node_modules/restructure": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/restructure/-/restructure-3.0.0.tgz", "integrity": "sha512-Xj8/MEIhhfj9X2rmD9iJ4Gga9EFqVlpMj3vfLnV2r/Mh5jRMryNV+6lWh9GdJtDBcBSPIqzRdfBQ3wDtNFv/uw==", "dev": true }, "node_modules/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "dev": true, "engines": { "node": ">= 4" } }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" } }, "node_modules/rfdc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", "dev": true }, "node_modules/rgb2hex": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/rgb2hex/-/rgb2hex-0.2.3.tgz", "integrity": "sha512-clEe0m1xv+Tva1B/TOepuIcvLAxP0U+sCDfgt1SX1HmI2Ahr5/Cd/nzJM1e78NKVtWdoo0s33YehpFA8UfIShQ==", "dev": true }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/roarr": { "version": "2.15.4", "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", "dev": true, "dependencies": { "boolean": "^3.0.1", "detect-node": "^2.0.4", "globalthis": "^1.0.1", "json-stringify-safe": "^5.0.1", "semver-compare": "^1.0.0", "sprintf-js": "^1.1.2" }, "engines": { "node": ">=8.0" } }, "node_modules/roarr/node_modules/sprintf-js": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", "dev": true }, "node_modules/rollup": { "version": "4.18.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz", "integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==", "dev": true, "dependencies": { "@types/estree": "1.0.5" }, "bin": { "rollup": "dist/bin/rollup" }, "engines": { "node": ">=18.0.0", "npm": ">=8.0.0" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.18.0", "@rollup/rollup-android-arm64": "4.18.0", "@rollup/rollup-darwin-arm64": "4.18.0", "@rollup/rollup-darwin-x64": "4.18.0", "@rollup/rollup-linux-arm-gnueabihf": "4.18.0", "@rollup/rollup-linux-arm-musleabihf": "4.18.0", "@rollup/rollup-linux-arm64-gnu": "4.18.0", "@rollup/rollup-linux-arm64-musl": "4.18.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0", "@rollup/rollup-linux-riscv64-gnu": "4.18.0", "@rollup/rollup-linux-s390x-gnu": "4.18.0", "@rollup/rollup-linux-x64-gnu": "4.18.0", "@rollup/rollup-linux-x64-musl": "4.18.0", "@rollup/rollup-win32-arm64-msvc": "4.18.0", "@rollup/rollup-win32-ia32-msvc": "4.18.0", "@rollup/rollup-win32-x64-msvc": "4.18.0", "fsevents": "~2.3.2" } }, "node_modules/rollup-plugin-filesize": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/rollup-plugin-filesize/-/rollup-plugin-filesize-10.0.0.tgz", "integrity": "sha512-JAYYhzCcmGjmCzo3LEHSDE3RAPHKIeBdpqRhiyZSv5o/3wFhktUOzYAWg/uUKyEu5dEaVaql6UOmaqHx1qKrZA==", "dev": true, "dependencies": { "@babel/runtime": "^7.13.8", "boxen": "^5.0.0", "brotli-size": "4.0.0", "colors": "1.4.0", "filesize": "^6.1.0", "gzip-size": "^6.0.0", "pacote": "^15.1.1", "terser": "^5.6.0" }, "engines": { "node": ">=16.0.0" } }, "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==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/feross" }, { "type": "patreon", "url": "https://www.patreon.com/feross" }, { "type": "consulting", "url": "https://feross.org/support" } ], "dependencies": { "queue-microtask": "^1.2.2" } }, "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==", "dev": true }, "node_modules/safe-regex-test": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", "dev": true, "peer": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", "is-regex": "^1.1.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, "node_modules/saucelabs": { "version": "4.7.8", "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-4.7.8.tgz", "integrity": "sha512-K2qaRUixc7+8JiAwpTvEsIQVzzUkYwa0mAfs0akGagRlWXUR1JrsmgJRyz28qkwpERW1KDuByn3Ju96BuW1V7Q==", "dev": true, "dependencies": { "bin-wrapper": "^4.1.0", "change-case": "^4.1.1", "form-data": "^3.0.0", "got": "^11.7.0", "hash.js": "^1.1.7", "tunnel": "0.0.6", "yargs": "^16.0.3" }, "bin": { "sl": "bin/sl" } }, "node_modules/saucelabs/node_modules/form-data": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "dev": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "mime-types": "^2.1.12" }, "engines": { "node": ">= 6" } }, "node_modules/saucelabs/node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.0", "y18n": "^5.0.5", "yargs-parser": "^20.2.2" }, "engines": { "node": ">=10" } }, "node_modules/sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true }, "node_modules/secure-compare": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", "integrity": "sha1-8aAymzCLIh+uN7mXTz1XjQypmeM=", "dev": true }, "node_modules/seek-bzip": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", "dev": true, "dependencies": { "commander": "^2.8.1" }, "bin": { "seek-bunzip": "bin/seek-bunzip", "seek-table": "bin/seek-bzip-table" } }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/semver-compare": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", "dev": true }, "node_modules/semver-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/semver-truncate": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/semver-truncate/-/semver-truncate-1.1.2.tgz", "integrity": "sha512-V1fGg9i4CL3qesB6U0L6XAm4xOJiHmt4QAacazumuasc03BvtFGIMCduv01JWQ69Nv+JST9TqhSCiJoxoY031w==", "dev": true, "dependencies": { "semver": "^5.3.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/semver-truncate/node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, "bin": { "semver": "bin/semver" } }, "node_modules/sentence-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", "dev": true, "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3", "upper-case-first": "^2.0.2" } }, "node_modules/serialize-error": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", "dev": true, "dependencies": { "type-fest": "^0.13.1" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/serialize-error/node_modules/type-fest": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/serialize-javascript": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", "dev": true, "dependencies": { "randombytes": "^2.1.0" } }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true }, "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==", "dev": true, "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==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "dev": true, "dependencies": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", "object-inspect": "^1.9.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, "node_modules/sigstore": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.6.0.tgz", "integrity": "sha512-QODKff/qW/TXOZI6V/Clqu74xnInAS6it05mufj4/fSewexLtfEntgLZZcBtUK44CDQyUE5TUXYy1ARYzlfG9g==", "dev": true, "dependencies": { "@sigstore/protobuf-specs": "^0.1.0", "@sigstore/tuf": "^1.0.0", "make-fetch-happen": "^11.0.1", "tuf-js": "^1.1.3" }, "bin": { "sigstore": "bin/sigstore.js" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/sigstore/node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, "engines": { "node": ">=12" } }, "node_modules/sigstore/node_modules/make-fetch-happen": { "version": "11.1.1", "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", "dev": true, "dependencies": { "agentkeepalive": "^4.2.1", "cacache": "^17.0.0", "http-cache-semantics": "^4.1.1", "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.0", "is-lambda": "^1.0.1", "lru-cache": "^7.7.1", "minipass": "^5.0.0", "minipass-fetch": "^3.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.3", "promise-retry": "^2.0.1", "socks-proxy-agent": "^7.0.0", "ssri": "^10.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/sigstore/node_modules/minipass-fetch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", "dev": true, "dependencies": { "minipass": "^5.0.0", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" }, "optionalDependencies": { "encoding": "^0.1.13" } }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true, "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" } }, "node_modules/smob": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/smob/-/smob-1.4.0.tgz", "integrity": "sha512-MqR3fVulhjWuRNSMydnTlweu38UhQ0HXM4buStD/S3mc/BzX3CuM9OmhyQpmtYCvoYdl5ris6TI0ZqH355Ymqg==", "dev": true }, "node_modules/snake-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", "dev": true, "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "node_modules/socket.io": { "version": "4.7.5", "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", "integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==", "dev": true, "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", "cors": "~2.8.5", "debug": "~4.3.2", "engine.io": "~6.5.2", "socket.io-adapter": "~2.5.2", "socket.io-parser": "~4.2.4" }, "engines": { "node": ">=10.2.0" } }, "node_modules/socket.io-adapter": { "version": "2.5.4", "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.4.tgz", "integrity": "sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg==", "dev": true, "dependencies": { "debug": "~4.3.4", "ws": "~8.11.0" } }, "node_modules/socket.io-adapter/node_modules/ws": { "version": "8.11.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", "dev": true, "engines": { "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "peerDependenciesMeta": { "bufferutil": { "optional": true }, "utf-8-validate": { "optional": true } } }, "node_modules/socket.io-parser": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", "dev": true, "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1" }, "engines": { "node": ">=10.0.0" } }, "node_modules/socks": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", "dev": true, "dependencies": { "ip": "^2.0.0", "smart-buffer": "^4.2.0" }, "engines": { "node": ">= 10.13.0", "npm": ">= 3.0.0" } }, "node_modules/socks-proxy-agent": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", "dev": true, "dependencies": { "agent-base": "^6.0.2", "debug": "^4.3.3", "socks": "^2.6.2" }, "engines": { "node": ">= 10" } }, "node_modules/sort-keys": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", "integrity": "sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==", "dev": true, "dependencies": { "is-plain-obj": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/sort-keys-length": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", "integrity": "sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==", "dev": true, "dependencies": { "sort-keys": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-support": { "version": "0.5.20", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", "dev": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "node_modules/source-map-support/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==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "node_modules/spdx-exceptions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "dev": true }, "node_modules/spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "node_modules/spdx-license-ids": { "version": "3.0.13", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", "dev": true }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, "node_modules/sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", "dev": true, "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", "bcrypt-pbkdf": "^1.0.0", "dashdash": "^1.12.0", "ecc-jsbn": "~0.1.1", "getpass": "^0.1.1", "jsbn": "~0.1.0", "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" }, "bin": { "sshpk-conv": "bin/sshpk-conv", "sshpk-sign": "bin/sshpk-sign", "sshpk-verify": "bin/sshpk-verify" }, "engines": { "node": ">=0.10.0" } }, "node_modules/ssri": { "version": "10.0.4", "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.4.tgz", "integrity": "sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==", "dev": true, "dependencies": { "minipass": "^5.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/streamroller": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", "dev": true, "dependencies": { "date-format": "^4.0.14", "debug": "^4.3.4", "fs-extra": "^8.1.0" }, "engines": { "node": ">=8.0" } }, "node_modules/strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", "dev": true, "engines": { "node": ">=0.10.0" } }, "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==", "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } }, "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==", "dev": true, "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": { "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==", "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, "node_modules/string.prototype.trim": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", "dev": true, "peer": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimend": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, "peer": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, "peer": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "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==", "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, "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==", "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "peer": true, "engines": { "node": ">=4" } }, "node_modules/strip-dirs": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", "dev": true, "dependencies": { "is-natural-number": "^4.0.1" } }, "node_modules/strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", "dev": true, "engines": { "node": ">=0.10.0" } }, "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, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/strip-outer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", "dev": true, "dependencies": { "escape-string-regexp": "^1.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "dependencies": { "has-flag": "^3.0.0" }, "engines": { "node": ">=4" } }, "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, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/svgdom": { "version": "0.1.19", "resolved": "https://registry.npmjs.org/svgdom/-/svgdom-0.1.19.tgz", "integrity": "sha512-gBvlZ74RECaG9VyPrj9OdakOarEKKvaXh5NVkbx9oWfAo4XnQehk75b14iOW2UjFHyZThczZ1NrPV9rDrecOVg==", "dev": true, "dependencies": { "fontkit": "^2.0.2", "image-size": "^1.0.2", "sax": "^1.2.4" }, "funding": { "type": "github", "url": "https://github.com/sponsors/Fuzzyma" } }, "node_modules/tar": { "version": "6.1.15", "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", "dev": true, "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" }, "engines": { "node": ">=10" } }, "node_modules/tar-fs": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", "dev": true, "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", "tar-stream": "^2.1.4" } }, "node_modules/tar-fs/node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "node_modules/tar-fs/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==", "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" }, "engines": { "node": ">= 6" } }, "node_modules/tar-fs/node_modules/tar-stream": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "dev": true, "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" }, "engines": { "node": ">=6" } }, "node_modules/tar-stream": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", "dev": true, "dependencies": { "bl": "^1.0.0", "buffer-alloc": "^1.2.0", "end-of-stream": "^1.0.0", "fs-constants": "^1.0.0", "readable-stream": "^2.3.0", "to-buffer": "^1.1.1", "xtend": "^4.0.0" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/tar/node_modules/chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true, "engines": { "node": ">=10" } }, "node_modules/tar/node_modules/fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dev": true, "dependencies": { "minipass": "^3.0.0" }, "engines": { "node": ">= 8" } }, "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/tar/node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, "bin": { "mkdirp": "bin/cmd.js" }, "engines": { "node": ">=10" } }, "node_modules/terser": { "version": "5.17.7", "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.7.tgz", "integrity": "sha512-/bi0Zm2C6VAexlGgLlVxA0P2lru/sdLyfCVaRMfKVo9nWxbmz7f/sD8VPybPeSUJaJcwmCJis9pBIhcVcG1QcQ==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" }, "engines": { "node": ">=10" } }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, "node_modules/timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/tiny-inflate": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", "dev": true }, "node_modules/tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", "dev": true, "dependencies": { "rimraf": "^3.0.0" }, "engines": { "node": ">=8.17.0" } }, "node_modules/to-buffer": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", "dev": true }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true, "engines": { "node": ">=4" } }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "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==", "dev": true, "engines": { "node": ">=0.6" } }, "node_modules/tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dev": true, "dependencies": { "psl": "^1.1.28", "punycode": "^2.1.1" }, "engines": { "node": ">=0.8" } }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true }, "node_modules/trim-repeated": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", "dev": true, "dependencies": { "escape-string-regexp": "^1.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", "dev": true, "peer": true, "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "node_modules/tsconfig-paths/node_modules/json5": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "peer": true, "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "node_modules/tslib": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", "dev": true }, "node_modules/tuf-js": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.6.tgz", "integrity": "sha512-CXwFVIsXGbVY4vFiWF7TJKWmlKJAT8TWkH4RmiohJRcDJInix++F0dznDmoVbtJNzZ8yLprKUG4YrDIhv3nBMg==", "dev": true, "dependencies": { "@tufjs/models": "1.0.4", "debug": "^4.3.4", "make-fetch-happen": "^11.1.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/tuf-js/node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, "engines": { "node": ">=12" } }, "node_modules/tuf-js/node_modules/make-fetch-happen": { "version": "11.1.1", "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", "dev": true, "dependencies": { "agentkeepalive": "^4.2.1", "cacache": "^17.0.0", "http-cache-semantics": "^4.1.1", "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.0", "is-lambda": "^1.0.1", "lru-cache": "^7.7.1", "minipass": "^5.0.0", "minipass-fetch": "^3.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.3", "promise-retry": "^2.0.1", "socks-proxy-agent": "^7.0.0", "ssri": "^10.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/tuf-js/node_modules/minipass-fetch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", "dev": true, "dependencies": { "minipass": "^5.0.0", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" }, "optionalDependencies": { "encoding": "^0.1.13" } }, "node_modules/tunnel": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", "dev": true, "engines": { "node": ">=0.6.11 <=0.7.0 || >=0.7.3" } }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, "dependencies": { "safe-buffer": "^5.0.1" }, "engines": { "node": "*" } }, "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, "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, "dependencies": { "prelude-ls": "^1.2.1" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" }, "engines": { "node": ">= 0.6" } }, "node_modules/typed-array-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", "dev": true, "peer": true, "dependencies": { "call-bind": "^1.0.2", "for-each": "^0.3.3", "is-typed-array": "^1.1.9" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/typescript": { "version": "5.4.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { "node": ">=14.17" } }, "node_modules/ua-parser-js": { "version": "0.7.35", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz", "integrity": "sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==", "dev": true, "funding": [ { "type": "opencollective", "url": "https://opencollective.com/ua-parser-js" }, { "type": "paypal", "url": "https://paypal.me/faisalman" } ], "engines": { "node": "*" } }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, "peer": true, "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", "has-symbols": "^1.0.3", "which-boxed-primitive": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/unbzip2-stream": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", "dev": true, "dependencies": { "buffer": "^5.2.1", "through": "^2.3.8" } }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/unicode-match-property-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" }, "engines": { "node": ">=4" } }, "node_modules/unicode-match-property-value-ecmascript": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/unicode-properties": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz", "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==", "dev": true, "dependencies": { "base64-js": "^1.3.0", "unicode-trie": "^2.0.0" } }, "node_modules/unicode-property-aliases-ecmascript": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/unicode-trie": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", "dev": true, "dependencies": { "pako": "^0.2.5", "tiny-inflate": "^1.0.0" } }, "node_modules/union": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", "dev": true, "dependencies": { "qs": "^6.4.0" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/unique-filename": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", "dev": true, "dependencies": { "unique-slug": "^4.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/unique-slug": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", "dev": true, "dependencies": { "imurmurhash": "^0.1.4" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, "engines": { "node": ">= 4.0.0" } }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "dev": true, "engines": { "node": ">= 0.8" } }, "node_modules/update-browserslist-db": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", "dev": true, "funding": [ { "type": "opencollective", "url": "https://opencollective.com/browserslist" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" }, { "type": "github", "url": "https://github.com/sponsors/ai" } ], "dependencies": { "escalade": "^3.1.2", "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" } }, "node_modules/upper-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", "dev": true, "dependencies": { "tslib": "^2.0.3" } }, "node_modules/upper-case-first": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", "dev": true, "dependencies": { "tslib": "^2.0.3" } }, "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, "dependencies": { "punycode": "^2.1.0" } }, "node_modules/url-join": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", "dev": true }, "node_modules/url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", "dev": true, "dependencies": { "prepend-http": "^2.0.0" }, "engines": { "node": ">=4" } }, "node_modules/url-to-options": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", "integrity": "sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A==", "dev": true, "engines": { "node": ">= 4" } }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", "dev": true, "engines": { "node": ">= 0.4.0" } }, "node_modules/uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", "dev": true, "bin": { "uuid": "bin/uuid" } }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "node_modules/validate-npm-package-name": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", "dev": true, "dependencies": { "builtins": "^5.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true, "engines": { "node": ">= 0.8" } }, "node_modules/verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, "engines": [ "node >=0.6.0" ], "dependencies": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, "node_modules/vm2": { "version": "3.9.19", "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.19.tgz", "integrity": "sha512-J637XF0DHDMV57R6JyVsTak7nIL8gy5KH4r1HiwWLf/4GBbb5MKL5y7LpmF4A8E2nR6XmzpmMFQ7V7ppPTmUQg==", "dev": true, "dependencies": { "acorn": "^8.7.0", "acorn-walk": "^8.2.0" }, "bin": { "vm2": "bin/vm2" }, "engines": { "node": ">=6.0" } }, "node_modules/vm2/node_modules/acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true, "engines": { "node": ">=0.4.0" } }, "node_modules/void-elements": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/webdriver": { "version": "6.12.1", "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-6.12.1.tgz", "integrity": "sha512-3rZgAj9o2XHp16FDTzvUYaHelPMSPbO1TpLIMUT06DfdZjNYIzZiItpIb/NbQDTPmNhzd9cuGmdI56WFBGY2BA==", "dev": true, "dependencies": { "@wdio/config": "6.12.1", "@wdio/logger": "6.10.10", "@wdio/protocols": "6.12.0", "@wdio/utils": "6.11.0", "got": "^11.0.2", "lodash.merge": "^4.6.1" }, "engines": { "node": ">=10.0.0" } }, "node_modules/webdriverio": { "version": "6.12.1", "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-6.12.1.tgz", "integrity": "sha512-Nx7ge0vTWHVIRUbZCT+IuMwB5Q0Q5nLlYdgnmmJviUKLuc3XtaEBkYPTbhHWHgSBXsPZMIc023vZKNkn+6iyeQ==", "dev": true, "dependencies": { "@types/puppeteer-core": "^5.4.0", "@wdio/config": "6.12.1", "@wdio/logger": "6.10.10", "@wdio/repl": "6.11.0", "@wdio/utils": "6.11.0", "archiver": "^5.0.0", "atob": "^2.1.2", "css-shorthand-properties": "^1.1.1", "css-value": "^0.0.1", "devtools": "6.12.1", "fs-extra": "^9.0.1", "get-port": "^5.1.1", "grapheme-splitter": "^1.0.2", "lodash.clonedeep": "^4.5.0", "lodash.isobject": "^3.0.2", "lodash.isplainobject": "^4.0.6", "lodash.zip": "^4.2.0", "minimatch": "^3.0.4", "puppeteer-core": "^5.1.0", "resq": "^1.9.1", "rgb2hex": "0.2.3", "serialize-error": "^8.0.0", "webdriver": "6.12.1" }, "engines": { "node": ">=10.0.0" } }, "node_modules/webdriverio/node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" }, "engines": { "node": ">=10" } }, "node_modules/webdriverio/node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/webdriverio/node_modules/serialize-error": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz", "integrity": "sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/webdriverio/node_modules/universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true, "engines": { "node": ">= 10.0.0" } }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "dev": true }, "node_modules/whatwg-encoding": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", "dev": true, "dependencies": { "iconv-lite": "0.6.3" }, "engines": { "node": ">=12" } }, "node_modules/whatwg-encoding/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, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dev": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/node-which" }, "engines": { "node": ">= 8" } }, "node_modules/which-boxed-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, "peer": true, "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", "is-number-object": "^1.0.4", "is-string": "^1.0.5", "is-symbol": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-typed-array": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", "dev": true, "peer": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-tostringtag": "^1.0.0", "is-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "dev": true, "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } }, "node_modules/widest-line": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", "dev": true, "dependencies": { "string-width": "^4.0.0" }, "engines": { "node": ">=8" } }, "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, "engines": { "node": ">=0.10.0" } }, "node_modules/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==", "dev": true, "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": { "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==", "dev": true, "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-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "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==", "dev": true, "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==", "dev": true }, "node_modules/wrap-ansi/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, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/wrap-ansi/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, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/wrap-ansi/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 }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, "node_modules/ws": { "version": "8.17.1", "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "dev": true, "engines": { "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { "optional": true }, "utf-8-validate": { "optional": true } } }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true, "engines": { "node": ">=0.4" } }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, "engines": { "node": ">=10" } }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" }, "engines": { "node": ">=12" } }, "node_modules/yargs-parser": { "version": "20.2.9", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, "engines": { "node": ">=10" } }, "node_modules/yargs/node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" }, "engines": { "node": ">=12" } }, "node_modules/yargs/node_modules/yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "engines": { "node": ">=12" } }, "node_modules/yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", "dev": true, "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } }, "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, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/zip-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", "dev": true, "dependencies": { "archiver-utils": "^2.1.0", "compress-commons": "^4.1.0", "readable-stream": "^3.6.0" }, "engines": { "node": ">= 10" } }, "node_modules/zip-stream/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==", "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" }, "engines": { "node": ">= 6" } } } } svg.js-3.2.4/package.json000066400000000000000000000075041463723416200152360ustar00rootroot00000000000000{ "name": "@svgdotjs/svg.js", "version": "3.2.4", "type": "module", "description": "A lightweight library for manipulating and animating SVG.", "url": "https://svgjs.dev/", "homepage": "https://svgjs.dev/", "keywords": [ "svg", "vector", "graphics", "animation" ], "author": "Wout Fierens ", "main": "dist/svg.node.cjs", "unpkg": "dist/svg.min.js", "jsdelivr": "dist/svg.min.js", "browser": "dist/svg.esm.js", "module": "src/main.js", "exports": { ".": { "import": { "types": "./svg.js.d.ts", "default": "./src/main.js" }, "require": { "types": "./svg.js.d.ts", "default": "./dist/svg.node.cjs" } } }, "files": [ "/dist", "/src", "/svg.js.d.ts", "/.config" ], "maintainers": [ { "name": "Wout Fierens", "email": "wout@mick-wout.com" }, { "name": "Alex Ewerlöf", "email": "alex@userpixel.com", "web": "http://www.ewerlof.name" }, { "name": "Ulrich-Matthias Schäfer", "email": "ulima.ums@googlemail.com", "web": "https://svgdotjs.github.io/" }, { "name": "Jon Ege Ronnenberg", "email": "jon@svgjs.dev", "url": "https://keybase.io/dotnetcarpenter" } ], "licenses": [ { "type": "MIT", "url": "http://www.opensource.org/licenses/mit-license.php" } ], "repository": { "type": "git", "url": "https://github.com/svgdotjs/svg.js.git" }, "github": "https://github.com/svgdotjs/svg.js", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/Fuzzyma" }, "typings": "./svg.js.d.ts", "scripts": { "build": "npm run format && npm run rollup", "build:polyfills": "npx rollup -c .config/rollup.polyfills.js", "build:tests": "npx rollup -c .config/rollup.tests.js", "fix": "npx eslint ./src --fix", "lint": "npx eslint ./src", "prettier": "npx prettier --write .", "format": "npm run fix && npm run prettier", "rollup": "npx rollup -c .config/rollup.config.js", "server": "npx http-server ./ -d", "test": "npx karma start .config/karma.conf.cjs || true", "test:ci": "karma start .config/karma.conf.saucelabs.cjs", "test:svgdom": "node ./spec/runSVGDomTest.js || true", "zip": "zip -j dist/svg.js.zip -- LICENSE.txt README.md CHANGELOG.md dist/svg.js dist/svg.js.map dist/svg.min.js dist/svg.min.js.map dist/polyfills.js dist/polyfillsIE.js", "prepublishOnly": "rm -rf ./dist && npm run build && npm run build:polyfills && npm test", "postpublish": "npm run zip", "checkTests": "node spec/checkForAllTests.js" }, "devDependencies": { "@babel/core": "^7.24.7", "@babel/eslint-parser": "^7.24.7", "@babel/plugin-transform-runtime": "^7.24.7", "@babel/preset-env": "^7.24.7", "@rollup/plugin-babel": "^6.0.4", "@rollup/plugin-commonjs": "^26.0.1", "@rollup/plugin-node-resolve": "^15.2.3", "@rollup/plugin-terser": "^0.4.4", "@target/custom-event-polyfill": "github:Adobe-Marketing-Cloud/custom-event-polyfill", "@types/jasmine": "^5.1.4", "babel-plugin-polyfill-corejs3": "^0.10.4", "core-js": "^3.37.1", "coveralls": "^3.1.1", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-config-standard": "^17.1.0", "http-server": "^14.1.1", "jasmine": "^5.1.0", "jasmine-core": "^5.1.2", "karma": "^6.4.3", "karma-chrome-launcher": "^3.2.0", "karma-coverage": "^2.2.1", "karma-firefox-launcher": "^2.1.3", "karma-jasmine": "^5.1.0", "karma-sauce-launcher": "^4.3.6", "prettier": "^3.3.2", "rollup": "^4.18.0", "rollup-plugin-filesize": "^10.0.0", "svgdom": "^0.1.19", "typescript": "^5.4.5", "yargs": "^17.7.2" }, "browserslist": ">0.3%, last 2 version, not dead, not op_mini all" } svg.js-3.2.4/playgrounds/000077500000000000000000000000001463723416200153115ustar00rootroot00000000000000svg.js-3.2.4/playgrounds/colors/000077500000000000000000000000001463723416200166125ustar00rootroot00000000000000svg.js-3.2.4/playgrounds/colors/index.html000066400000000000000000000007151463723416200206120ustar00rootroot00000000000000 SVG Playground

Color Playground

Lets test the different types of random colors we can make

svg.js-3.2.4/playgrounds/colors/main.js000066400000000000000000000013221463723416200200720ustar00rootroot00000000000000let canvas = SVG('#canvas').group().translate(-150, 230) // Make a bunch of rectangles function rectangles(method = 'Vibrant') { // Make a group let group = canvas.group() group.text(method).attr('font-size', 50).move(-230, 20) // Add the squares for (let i = 0; i < 20; i++) { let color = SVG.Color.random(method.toLowerCase()).toHex() let rect = group .rect(100, 100) .x(20 + 100 * i) .fill(color) } return group } rectangles('Vibrant').translate(0, 100) rectangles('Sine').translate(0, 220) rectangles('Pastel').translate(0, 340) rectangles('Dark').translate(0, 460) rectangles('RGB').translate(0, 580) rectangles('LAB').translate(0, 700) rectangles('Grey').translate(0, 820) svg.js-3.2.4/playgrounds/colors/style.css000066400000000000000000000016131463723416200204650ustar00rootroot00000000000000* { box-sizing: border-box; } html { background-color: #fefefe; } body { margin: 0; width: 100vw; height: 99vh; grid-gap: 30px; display: inline-grid; align-items: center; grid-template-columns: 10vw 40vw auto 10vw; grid-template-rows: 0 10vw auto 0; } h1 { text-align: right; border-right: solid 3px #f06; padding-right: 12px; color: #f06; font-size: 52px; font-family: Helvetica; grid-row: 2; grid-column: 2; line-height: 1.8em; } p { padding-right: 50px; color: #444; font-size: 18px; font-family: Helvetica; grid-row: 2; grid-column: 3; } svg { height: 100%; width: 100%; grid-row: 3; grid-column: 2/4; background-color: #f5f6f7; border-radius: 20px; border: #f065 1px solid; } .pink { fill: #ff0066; } .green { fill: #00ff99; } .dark-pink { fill: #660029; } .light-pink { fill: #ff99c2; } .off-white { fill: #ffcce0; } svg.js-3.2.4/playgrounds/matrix/000077500000000000000000000000001463723416200166155ustar00rootroot00000000000000svg.js-3.2.4/playgrounds/matrix/drag.js000066400000000000000000000031151463723416200200700ustar00rootroot00000000000000function reactToDrag(element, onDrag, beforeDrag) { let xStart, yStart let startDrag = (event) => { // Avoid the default events event.preventDefault() // Store the position where the drag started xStart = event.pageX yStart = event.pageY // Fire the start drag event if (beforeDrag) { var { x, y } = parent.point(event.pageX, event.pageY) beforeDrag(event, x, y) } // Register events to react to dragging and drag ends SVG.on(window, ['mousemove.drag', 'touchmove.drag'], reactDrag) SVG.on(window, ['mouseup.drag', 'touchend.drag'], stopDrag) } let reactDrag = (event) => { // Convert screen coordinates to svg coordinates and use them var { x, y } = parent.point(event.pageX, event.pageY) if (onDrag) onDrag(event, x, y) } let stopDrag = (event) => { SVG.off(window, ['mousemove.drag', 'touchmove.drag']) SVG.off(window, ['mouseup.drag', 'touchend.drag']) } // Bind the drag tracker to this element directly let parent = element.root() let point = new SVG.Point() element.mousedown(startDrag).touchstart(startDrag) } SVG.extend(SVG.Element, { draggable: function (after) { let sx, sy reactToDrag( this, (e, x, y) => { this.transform({ origin: [sx, sy], position: [x, y] }) if (after) { after(this, x, y) } }, (e, x, y) => { var toAbsolute = new SVG.Matrix(this).inverse() var p = new SVG.Point(x, y).transform(toAbsolute) sx = p.x sy = p.y } ) return this } }) svg.js-3.2.4/playgrounds/matrix/index.html000066400000000000000000000023271463723416200206160ustar00rootroot00000000000000 SVG Playground

SVG Transformations

This playground tests the compose/decompose functionality in svg matrix, as well as the draggable code and the transformations.

svg.js-3.2.4/playgrounds/matrix/matrix.js000066400000000000000000000015661463723416200204670ustar00rootroot00000000000000function print(mat) { let { a, b, c, d } = mat console.log(` a: ${a.toFixed(2)} b: ${b.toFixed(2)} c: ${c.toFixed(2)} d: ${d.toFixed(2)} `) } function moveit() { let { cx: x0, cy: y0 } = or.rbox(svg) let { cx: x1, cy: y1 } = b1.rbox(svg) let { cx: x2, cy: y2 } = b2.rbox(svg) let m = new SVG.Matrix( (x1 - x0) / 50, (y1 - y0) / 50, (x2 - x0) / 50, (y2 - y0) / 50, x0, y0 ) let com = m.decompose() let g = new SVG.Matrix().compose(com) // Transform both of the items target.transform(m) mover.transform(g) console.log(com) print(m) print(g) } // Declare the two points let svg = SVG('svg') var or = SVG('#or').draggable(moveit) var b1 = SVG('#b1').draggable(moveit) var b2 = SVG('#b2').draggable(moveit) // Declare the squares let target = SVG('#true') let mover = SVG('#guess') let tester = SVG('#tester') svg.js-3.2.4/playgrounds/matrix/style.css000066400000000000000000000016131463723416200204700ustar00rootroot00000000000000* { box-sizing: border-box; } html { background-color: #fefefe; } body { margin: 0; width: 100vw; height: 99vh; grid-gap: 30px; display: inline-grid; align-items: center; grid-template-columns: 10vw 40vw auto 10vw; grid-template-rows: 0 10vw auto 0; } h1 { text-align: right; border-right: solid 3px #f06; padding-right: 12px; color: #f06; font-size: 52px; font-family: Helvetica; grid-row: 2; grid-column: 2; line-height: 1.8em; } p { padding-right: 50px; color: #444; font-size: 18px; font-family: Helvetica; grid-row: 2; grid-column: 3; } svg { height: 100%; width: 100%; grid-row: 3; grid-column: 2/4; background-color: #f5f6f7; border-radius: 20px; border: #f065 1px solid; } .pink { fill: #ff0066; } .green { fill: #00ff99; } .dark-pink { fill: #660029; } .light-pink { fill: #ff99c2; } .off-white { fill: #ffcce0; } svg.js-3.2.4/playgrounds/transforms/000077500000000000000000000000001463723416200175075ustar00rootroot00000000000000svg.js-3.2.4/playgrounds/transforms/index.html000066400000000000000000000010411463723416200215000ustar00rootroot00000000000000 SVG Playground

Transformations

Here you can try out our transformation code, try moving around the pink box in your console with its variable name: mover

svg.js-3.2.4/playgrounds/transforms/style.css000066400000000000000000000016131463723416200213620ustar00rootroot00000000000000* { box-sizing: border-box; } html { background-color: #fefefe; } body { margin: 0; width: 100vw; height: 99vh; grid-gap: 30px; display: inline-grid; align-items: center; grid-template-columns: 10vw 40vw auto 10vw; grid-template-rows: 0 10vw auto 0; } h1 { text-align: right; border-right: solid 3px #f06; padding-right: 12px; color: #f06; font-size: 52px; font-family: Helvetica; grid-row: 2; grid-column: 2; line-height: 1.8em; } p { padding-right: 50px; color: #444; font-size: 18px; font-family: Helvetica; grid-row: 2; grid-column: 3; } svg { height: 100%; width: 100%; grid-row: 3; grid-column: 2/4; background-color: #f5f6f7; border-radius: 20px; border: #f065 1px solid; } .pink { fill: #ff0066; } .green { fill: #00ff99; } .dark-pink { fill: #660029; } .light-pink { fill: #ff99c2; } .off-white { fill: #ffcce0; } svg.js-3.2.4/playgrounds/transforms/transforms.js000066400000000000000000000010041463723416200222360ustar00rootroot00000000000000let canvas = SVG('#canvas') // Make the green rectangle canvas.rect(200, 400).move(200, 400).attr('opacity', 0.3).addClass('green') // Make the pink rectangle let a = canvas .rect(200, 400) .move(200, 400) .attr('opacity', 0.3) .addClass('pink') .transform({ px: 100, py: 500, origin: 'top-left' }) a.animate().rotate({ rotate: 500, origin: 'top-right' }) // Put an ellipse where we expect the object to be canvas .ellipse(30, 30) .center(100, 500) .attr('opacity', 0.3) .addClass('dark-pink') svg.js-3.2.4/playgrounds/webpack.config.js000066400000000000000000000010531463723416200205260ustar00rootroot00000000000000var path = require('path') module.exports = function (env) { let currentTest = path.resolve(__dirname, env) return { mode: 'development', devtool: 'eval-source-map', devServer: { contentBase: [currentTest, __dirname] }, devServer: { contentBase: [currentTest, '..'] }, entry: { app: path.resolve(currentTest, 'main.js') }, output: { path: currentTest, filename: 'bundle.js' }, resolve: { modules: [path.resolve(__dirname, 'node_modules'), 'node_modules'] } } } svg.js-3.2.4/spec/000077500000000000000000000000001463723416200136745ustar00rootroot00000000000000svg.js-3.2.4/spec/RAFPlugin.js000066400000000000000000000036051463723416200160250ustar00rootroot00000000000000/* globals jasmine */ /** * Jasmine RequestAnimationFrame: a set of helpers for testing functionality * that uses requestAnimationFrame under the Jasmine BDD framework for JavaScript. */ function RAFPlugin(jasmine) { var index = 0 var callbacks = [] function MockRAF() { this.nextTime = 0 var _this = this /** * Mock for window.requestAnimationFrame */ this.mockRAF = function (fn) { if (typeof fn !== 'function') { throw new Error('You should pass a function to requestAnimationFrame') } const i = index++ callbacks[i] = fn return i } /** * Mock for window.cancelAnimationFrame */ this.mockCAF = function (requestID) { callbacks.splice(requestID, 1) } this.mockPerf = { now: function () { return _this.nextTime } } /** * Install request animation frame mocks. */ this.install = function (global) { _this.realRAF = global.requestAnimationFrame _this.realCAF = global.cancelAnimationFrame _this.realPerf = global.performance global.requestAnimationFrame = _this.mockRAF global.cancelAnimationFrame = _this.mockCAF global.performance = _this.mockPerf } /** * Uninstall request animation frame mocks. */ this.uninstall = function (global) { global.requestAnimationFrame = _this.realRAF global.cancelAnimationFrame = _this.realCAF global.performance = _this.realPerf _this.nextTime = 0 callbacks = [] } /** * Simulate animation frame readiness. */ this.tick = function (dt) { _this.nextTime += dt || 1 var fns = callbacks var fn var i callbacks = [] index = 0 for (i in fns) { fn = fns[i] fn(_this.nextTime) } } } jasmine.RequestAnimationFrame = new MockRAF() } RAFPlugin(jasmine) svg.js-3.2.4/spec/SpecRunner.html000066400000000000000000000015711463723416200166520ustar00rootroot00000000000000 SVG.js - Jasmine Spec Runner svg.js-3.2.4/spec/SpecRunnerEs6.html000066400000000000000000000042631463723416200172310ustar00rootroot00000000000000 SVG.js - Jasmine Spec Runner svg.js-3.2.4/spec/checkForAllTests.js000066400000000000000000000011371463723416200174340ustar00rootroot00000000000000const glob = require('glob') const path = require('path') glob('./spec/*/**/*.js', (err, tests) => { if (err) { throw err } glob('./src/**/*.js', (err, files) => { if (err) { throw err } files = files.map((e) => path.basename(e)) tests = tests.map((e) => path.basename(e)) const difference = files.filter((x) => !tests.includes(x)) if (difference.length) { console.error( 'The following files dont have a test file:\n\t' + difference.join('\n\t') ) } else { console.info('All src files are covered by tests') } }) }) svg.js-3.2.4/spec/fixtures/000077500000000000000000000000001463723416200155455ustar00rootroot00000000000000svg.js-3.2.4/spec/fixtures/fixture.css000066400000000000000000000001201463723416200177360ustar00rootroot00000000000000#drawing { width: 500px; height: 500px; position: fixed; z-index: -1; } svg.js-3.2.4/spec/fixtures/fixture.svg000066400000000000000000000024051463723416200177550ustar00rootroot00000000000000 Some description A B C svg.js-3.2.4/spec/fixtures/pixel.png000066400000000000000000000001671463723416200174000ustar00rootroot00000000000000PNG  IHDRwSsRGBgAMA a pHYsod IDATWc?5IENDB`svg.js-3.2.4/spec/helpers.js000066400000000000000000000101651463723416200156770ustar00rootroot00000000000000import { getWindow } from '../src/utils/window.js' import { svg } from '../src/modules/core/namespaces.js' function tag(name, attrs, children) { const doc = getWindow().document const el = doc.createElementNS(svg, name) let i for (i in attrs) { el.setAttribute(i, attrs[i]) } for (i in children) { if (typeof children[i] === 'string') { children[i] = doc.createTextNode(children[i]) } el.appendChild(children[i]) } return el } export function fixtures() { return tag( 'svg', { height: 0, width: 0, id: 'inlineSVG' }, [ tag('defs', {}, [ tag('linearGradient', {}, [ tag('stop', { offset: '5%', 'stop-color': 'green' }), tag('stop', { offset: '95%', 'stop-color': 'gold' }) ]), tag('radialGradient', {}, [ tag('stop', { offset: '5%', 'stop-color': 'green' }), tag('stop', { offset: '95%', 'stop-color': 'gold' }) ]) ]), tag('desc', {}, ['Some description']), tag('path', { id: 'lineAB', d: 'M 100 350 l 150 -300', stroke: 'red', 'stroke-width': '3', fill: 'none' }), tag('path', { id: 'lineBC', d: 'M 250 50 l 150 300', stroke: 'red', 'stroke-width': '3', fill: 'none' }), tag('path', { d: 'M 175 200 l 150 0', stroke: 'green', 'stroke-width': '3', fill: 'none' }), tag('path', { d: 'M 100 350 q 150 -300 300 0', stroke: 'blue', 'stroke-width': '5', fill: 'none' }), tag( 'g', { stroke: 'black', 'stroke-width': '2', fill: 'black', id: 'pointGroup' }, [ tag('circle', { id: 'pointA', cx: '100', cy: '350', r: '3' }), tag('circle', { id: 'pointB', cx: '250', cy: '50', r: '50' }), tag('circle', { id: 'pointC', cx: '400', cy: '350', r: '50' }) ] ), tag( 'g', { 'font-size': '30', font: 'sans-serif', fill: 'black', stroke: 'none', 'text-anchor': 'middle', id: 'labelGroup' }, [ tag( 'text', { x: '100', y: '350', dy: '-30' }, ['A'] ), tag( 'text', { x: '250', y: '50', dy: '-10' }, ['B'] ), tag( 'text', { x: '400', y: '350', dx: '30' }, ['C'] ) ] ), tag('polygon', { points: '200,10 250,190 160,210' }), tag('polyline', { points: '20,20 40,25 60,40 80,120 120,140 200,180' }) ] ) } export function buildFixtures() { const doc = getWindow().document const body = doc.body || doc.documentElement const div = doc.createElement('div') div.id = 'fixtures' try { // FIXME: doesn't work in svgdom div.style.position = 'absolute' div.style.top = 0 div.style.left = 0 } catch (e) { // } div.appendChild(fixtures()) body.appendChild(div) } export function buildCanvas() { const doc = getWindow().document const body = doc.body || doc.documentElement const div = doc.createElement('div') div.id = 'canvas' try { // FIXME: doesn't work in svgdom div.style.position = 'absolute' div.style.top = 0 div.style.left = 0 } catch (e) { // } body.appendChild(div) } export function clear() { const doc = getWindow().document const canvas = doc.getElementById('canvas') const fixtures = doc.getElementById('fixtures') // remove if present fixtures && fixtures.parentNode.removeChild(fixtures) canvas.parentNode.removeChild(canvas) ;[...doc.querySelectorAll('svg')].forEach((el) => el.parentNode.removeChild(el) ) } svg.js-3.2.4/spec/runSVGDomTest.js000066400000000000000000000006211463723416200167150ustar00rootroot00000000000000/* This file has to be run with esm because node does not understand imports yet: node -r esm ./spec/runSvgdomTest.js || true Without "|| true" node reports a super long error when a test fails */ import Jasmine from 'jasmine' const jasmine = new Jasmine() jasmine.loadConfig({ spec_dir: '/', spec_files: ['spec/spec/*/**/*.js'], helpers: ['spec/setupSVGDom.js'] }) jasmine.execute() svg.js-3.2.4/spec/setupBrowser.js000066400000000000000000000004641463723416200167420ustar00rootroot00000000000000/* globals beforeEach, afterEach, jasmine */ import { buildCanvas, clear } from './helpers.js' jasmine.DEFAULT_TIMEOUT_INTERVAL = 500 beforeEach(() => { // buildFixtures() buildCanvas() window.container = document.getElementById('canvas') }) afterEach(() => { clear() window.container = null }) svg.js-3.2.4/spec/setupSVGDom.js000066400000000000000000000010541463723416200164120ustar00rootroot00000000000000import './RAFPlugin.js' import { createHTMLWindow } from 'svgdom' /* globals beforeEach, afterEach, jasmine */ import { buildCanvas, clear } from './helpers.js' import { registerWindow } from '../src/main.js' jasmine.DEFAULT_TIMEOUT_INTERVAL = 200 function setup() { const win = createHTMLWindow() registerWindow(win, win.document) buildCanvas() // buildFixtures() global.container = win.document.getElementById('canvas') } function teardown() { clear() global.container = null registerWindow() } beforeEach(setup) afterEach(teardown) svg.js-3.2.4/spec/spec/000077500000000000000000000000001463723416200146265ustar00rootroot00000000000000svg.js-3.2.4/spec/spec/animation/000077500000000000000000000000001463723416200166055ustar00rootroot00000000000000svg.js-3.2.4/spec/spec/animation/Animator.js000066400000000000000000000050571463723416200207240ustar00rootroot00000000000000/* globals describe, expect, it, beforeEach, afterEach, jasmine */ import { Animator, Queue } from '../../../src/main.js' import { getWindow } from '../../../src/utils/window.js' describe('Animator.js', () => { beforeEach(() => { jasmine.RequestAnimationFrame.install(getWindow()) Animator.timeouts = new Queue() Animator.frames = new Queue() Animator.immediates = new Queue() Animator.nextDraw = null }) afterEach(() => { jasmine.RequestAnimationFrame.uninstall(getWindow()) }) describe('timeout()', () => { it('calls a function after a specific time', () => { var spy = jasmine.createSpy('tester') Animator.timeout(spy, 100) jasmine.RequestAnimationFrame.tick(99) expect(spy).not.toHaveBeenCalled() jasmine.RequestAnimationFrame.tick() expect(spy).toHaveBeenCalled() }) }) describe('cancelTimeout()', () => { it('cancels a timeout which was created with timeout()', () => { var spy = jasmine.createSpy('tester') var id = Animator.timeout(spy, 100) Animator.clearTimeout(id) expect(spy).not.toHaveBeenCalled() jasmine.RequestAnimationFrame.tick(100) expect(spy).not.toHaveBeenCalled() }) }) describe('frame()', () => { it('calls a function at the next animationFrame', () => { var spy = jasmine.createSpy('tester') Animator.frame(spy) expect(spy).not.toHaveBeenCalled() jasmine.RequestAnimationFrame.tick() expect(spy).toHaveBeenCalled() }) }) describe('cancelFrame()', () => { it('cancels a single frame which was created with frame()', () => { var spy = jasmine.createSpy('tester') const id = Animator.frame(spy) Animator.cancelFrame(id) expect(spy).not.toHaveBeenCalled() jasmine.RequestAnimationFrame.tick() expect(spy).not.toHaveBeenCalled() }) }) describe('immediate()', () => { it('calls a function at the next animationFrame but after all frames are processed', () => { var spy = jasmine.createSpy('tester') Animator.immediate(spy) expect(spy).not.toHaveBeenCalled() jasmine.RequestAnimationFrame.tick() expect(spy).toHaveBeenCalled() }) }) describe('cancelImmediate()', () => { it('cancels an immediate cakk which was created with immediate()', () => { var spy = jasmine.createSpy('tester') const id = Animator.immediate(spy) Animator.cancelImmediate(id) expect(spy).not.toHaveBeenCalled() jasmine.RequestAnimationFrame.tick() expect(spy).not.toHaveBeenCalled() }) }) }) svg.js-3.2.4/spec/spec/animation/Controller.js000066400000000000000000000276041463723416200212770ustar00rootroot00000000000000/* globals describe, expect, it, jasmine */ import { easing, defaults } from '../../../src/main.js' import { Stepper, Ease, Controller, Spring, PID } from '../../../src/animation/Controller.js' const { any, createSpy } = jasmine describe('Controller.js', () => { describe('easing', () => { var easedValues = { '-': 0.5, '<>': 0.5, '>': 0.7071, '<': 0.2929 } ;['-', '<>', '<', '>'].forEach((el) => { describe(el, () => { it('is 0 at 0', () => { expect(easing[el](0)).toBe(0) }) it('is 1 at 1', () => { expect(Math.round(easing[el](1) * 1000) / 1000).toBe(1) // we need to round cause for some reason at some point 1==0.999999999 }) it('is eased at 0.5', () => { expect(easing[el](0.5)).toBeCloseTo(easedValues[el]) }) }) }) describe('beziere()', () => { const b1 = easing.bezier(0.25, 0.25, 0.75, 0.75) const b2 = easing.bezier(-0.25, -0.25, 0.75, 0.75) const b3 = easing.bezier(0.5, 0.5, 2, 2) const b4 = easing.bezier(1, 1, 2, 2) const b5 = easing.bezier(-1, -1, -2, -2) it('is 0 at 0', () => { expect(b1(0)).toBe(0) }) it('is 1 at 1', () => { expect(b1(1)).toBe(1) }) it('is eased at 0.5', () => { expect(b1(0.5)).toBe(0.5) expect(b2(0.5)).toBe(0.3125) expect(b3(0.5)).toBe(1.0625) expect(b4(0.5)).toBe(1.25) expect(b5(0.5)).toBe(-1) }) it('handles values bigger 1', () => { expect(b1(1.5)).toBe(1.5) expect(b2(1.5)).toBe(1.5) expect(b3(1.5)).toBe(1.5) expect(b4(1.5)).toBe(1) expect(b5(1.5)).toBe(1.5) }) it('handles values lower 0', () => { expect(b1(-0.5)).toBe(-0.5) expect(b2(-0.5)).toBe(-0.5) expect(b3(-0.5)).toBe(-0.5) expect(b4(-0.5)).toBe(-0.5) expect(b5(-0.5)).toBe(0) }) }) describe('steps()', () => { const s1 = easing.steps(5) const s2 = easing.steps(5, 'start') const s3 = easing.steps(5, 'end') const s4 = easing.steps(5, 'none') const s5 = easing.steps(5, 'both') it('is 0 at 0', () => { expect(s1(0)).toBe(0) expect(s1(0, true)).toBe(0) expect(s2(0)).toBe(0.2) expect(s2(0, true)).toBe(0) expect(s3(0)).toBe(0) expect(s3(0, true)).toBe(0) expect(s4(0)).toBe(0) expect(s4(0, true)).toBe(0) expect(s5(0)).toBe(1 / 6) expect(s5(0, true)).toBe(0) }) it('also works at values < 0', () => { expect(s1(-0.1)).toBe(-0.2) expect(s1(-0.1, true)).toBe(-0.2) expect(s2(-0.1)).toBe(0) expect(s2(-0.1, true)).toBe(0) expect(s3(-0.1)).toBe(-0.2) expect(s3(-0.1, true)).toBe(-0.2) expect(s4(-0.1)).toBe(-0.25) expect(s4(-0.1, true)).toBe(-0.25) expect(s5(-0.1)).toBe(0) expect(s5(-0.1, true)).toBe(0) }) it('is 1 at 1', () => { expect(s1(1)).toBe(1) expect(s1(1, true)).toBe(0.8) expect(s2(1)).toBe(1) expect(s2(1, true)).toBe(1) expect(s3(1)).toBe(1) expect(s3(1, true)).toBe(0.8) expect(s4(1)).toBe(1) expect(s4(1, true)).toBe(1) expect(s5(1)).toBe(1) expect(s5(1, true)).toBe(5 / 6) }) it('also works at values > 1', () => { expect(s1(1.1)).toBe(1) expect(s1(1.1, true)).toBe(1) expect(s2(1.1)).toBe(1.2) expect(s2(1.1, true)).toBe(1.2) expect(s3(1.1)).toBe(1) expect(s3(1.1, true)).toBe(1) expect(s4(1.1)).toBe(1.25) expect(s4(1.1, true)).toBe(1.25) expect(s5(1.1)).toBe(1) expect(s5(1.1, true)).toBe(1) }) it('is eased at 0.1', () => { expect(s1(0.1)).toBe(0) expect(s1(0.1, true)).toBe(0) expect(s2(0.1)).toBe(0.2) expect(s2(0.1, true)).toBe(0) expect(s3(0.1)).toBe(0) expect(s3(0.1, true)).toBe(0) expect(s4(0.1)).toBe(0) expect(s4(0.1, true)).toBe(0) expect(s5(0.1)).toBe(1 / 6) expect(s5(0.1, true)).toBe(0) }) it('is eased at 0.15', () => { expect(s1(0.15)).toBe(0) expect(s1(0.15, true)).toBe(0) expect(s2(0.15)).toBe(0.2) expect(s2(0.15, true)).toBe(0) expect(s3(0.15)).toBe(0) expect(s3(0.15, true)).toBe(0) expect(s4(0.15)).toBe(0) expect(s4(0.15, true)).toBe(0) expect(s5(0.15)).toBe(1 / 6) expect(s5(0.15, true)).toBe(0) }) it('is eased at 0.2', () => { expect(s1(0.2)).toBe(0.2) expect(s1(0.2, true)).toBe(0.2) expect(s2(0.2)).toBe(0.4) expect(s2(0.2, true)).toBe(0.4) expect(s3(0.2)).toBe(0.2) expect(s3(0.2, true)).toBe(0.2) expect(s4(0.2)).toBe(0.25) expect(s4(0.2, true)).toBe(0.25) expect(s5(0.2)).toBe(1 / 3) expect(s5(0.2, true)).toBe(1 / 3) }) it('is eased at 0.25', () => { expect(s1(0.25)).toBe(0.2) expect(s1(0.25, true)).toBe(0.2) expect(s2(0.25)).toBe(0.4) expect(s2(0.25, true)).toBe(0.4) expect(s3(0.25)).toBe(0.2) expect(s3(0.25, true)).toBe(0.2) expect(s4(0.25)).toBe(0.25) expect(s4(0.25, true)).toBe(0.25) expect(s5(0.25)).toBe(1 / 3) expect(s5(0.25, true)).toBe(1 / 3) }) }) }) describe('Stepper', () => { it('has a done() method', () => { const stepper = new Stepper() expect(stepper).toEqual(any(Stepper)) expect(stepper.done()).toBe(false) }) }) describe('Ease', () => { describe('()', () => { it('wraps the default easing function by default', () => { const ease = new Ease() expect(ease.ease).toBe(easing[defaults.timeline.ease]) }) it('wraps an easing function found in "easing"', () => { const ease = new Ease('-') expect(ease.ease).toBe(easing['-']) }) it('wraps a a custom easing function', () => { const ease = new Ease(easing['-']) expect(ease.ease).toBe(easing['-']) }) }) describe('step()', () => { it('provides an eased value to a position', () => { let ease = new Ease(easing['-']) expect(ease.step(2, 4, 0.5)).toBe(3) ease = new Ease(() => 3) expect(ease.step(2, 4, 0.5)).toBe(8) ease = new Ease() expect(ease.step(2, 4, 0.5)).toBeCloseTo(3.414, 3) }) it('jumps to "to" value at pos 1 if from is not a number', () => { const ease = new Ease('-') expect(ease.step('Hallo', 'Welt', 0.999)).toBe('Hallo') expect(ease.step('Hallo', 'Welt', 1)).toBe('Welt') }) }) }) describe('Controller', () => { describe('()', () => { it('constructs a controller with the given stepper function set', () => { const spy = createSpy() const controller = new Controller(spy) expect(controller).toEqual(any(Controller)) expect(controller.stepper).toBe(spy) }) }) describe('step()', () => { it('runs the stepper with current value, target value, dt and context', () => { const spy = createSpy().and.returnValue('foo') const controller = new Controller(spy) expect(controller.step(10, 20, 30, 'bar')).toBe('foo') expect(spy).toHaveBeenCalledWith(10, 20, 30, 'bar') }) }) describe('done()', () => { it('returns given values "done" property', () => { const spy = createSpy() const controller = new Controller(spy) expect(controller.done({ done: 'yes' })).toBe('yes') }) }) }) describe('Spring', () => { describe('()', () => { it('creates a spring with default duration and overshoot', () => { const spring = new Spring() expect(spring).toEqual(any(Spring)) expect(spring.duration()).toBe(500) expect(spring.overshoot()).toBe(0) }) it('creates a spring with given duration and overshoot', () => { const spring = new Spring(100, 10) expect(spring).toEqual(any(Spring)) expect(spring.duration()).toBe(100) expect(spring.overshoot()).toBe(10) }) }) describe('duration()', () => { it('gets and sets a new duration for the spring controller', () => { const spring = new Spring().duration(100) expect(spring.duration()).toBe(100) }) }) describe('overshoot()', () => { it('gets and sets a new overshoot for the spring controller', () => { const spring = new Spring().overshoot(10) expect(spring.overshoot()).toBe(10) }) }) describe('step()', () => { it('calculates the new spring position', () => { const spring = new Spring() expect(spring.step(0, 100, 16, {})).toBeCloseTo(0.793, 3) }) it('returns current if current is a string', () => { const spring = new Spring() expect(spring.step('Hallo', 'Welt', 16, {})).toBe('Hallo') }) it('returns current if dt is 0', () => { const spring = new Spring() expect(spring.step(0, 100, 0, {})).toBe(0) }) it('is done if dt is infinity and returns target', () => { const spring = new Spring() const context = {} expect(spring.step(0, 100, Infinity, context)).toBe(100) expect(spring.done(context)).toBe(true) }) it('uses dt of 16 if it is over 100', () => { const spring = new Spring() expect(spring.step(0, 100, 101, {})).toBe(spring.step(0, 100, 16, {})) }) }) }) describe('PID', () => { describe('()', () => { it('creates a PID controller with default values', () => { const pid = new PID() expect(pid).toEqual(any(PID)) expect(pid.p()).toBe(0.1) expect(pid.i()).toBe(0.01) expect(pid.d()).toBe(0) expect(pid.windup()).toBe(1000) }) it('creates a PID controller with given values', () => { const pid = new PID(1, 2, 3, 4) expect(pid).toEqual(any(PID)) expect(pid.p()).toBe(1) expect(pid.i()).toBe(2) expect(pid.d()).toBe(3) expect(pid.windup()).toBe(4) }) }) describe('p()', () => { it('gets and sets the p parameter of the controller', () => { const pid = new PID().p(100) expect(pid.p()).toBe(100) }) }) describe('i()', () => { it('gets and sets the i parameter of the controller', () => { const pid = new PID().i(100) expect(pid.i()).toBe(100) }) }) describe('d()', () => { it('gets and sets the d parameter of the controller', () => { const pid = new PID().d(100) expect(pid.d()).toBe(100) }) }) describe('windup()', () => { it('gets and sets the windup parameter of the controller', () => { const pid = new PID().windup(100) expect(pid.windup()).toBe(100) }) }) describe('step()', () => { it('returns current if current is a string', () => { const pid = new PID() expect(pid.step('Hallo', 'Welt', 16, {})).toBe('Hallo') }) it('returns current if dt is 0', () => { const pid = new PID() expect(pid.step(0, 100, 0, {})).toBe(0) }) it('is done if dt is infinity and returns target', () => { const pid = new PID() const context = {} expect(pid.step(0, 100, Infinity, context)).toBe(100) expect(pid.done(context)).toBe(true) }) it('calculates a new value', () => { const pid = new PID() expect(pid.step(0, 100, 16, {})).toBe(20) }) it('uses antiwindup to restrict i power', () => { const pid = new PID(0, 5, 0, 100) expect(pid.step(0, 100, 1000, {})).toBe(500) }) it('does not use antiwindup if disabled', () => { const pid = new PID(0, 5, 0, false) expect(pid.step(0, 100, 1000, {})).toBe(500000) }) }) }) }) svg.js-3.2.4/spec/spec/animation/Morphable.js000066400000000000000000000372561463723416200210710ustar00rootroot00000000000000/* globals describe, expect, it, jasmine */ import { Morphable, NonMorphable, ObjectBag, Color, Box, Matrix, PointArray, PathArray, TransformBag, Number as SVGNumber, Array as SVGArray } from '../../../src/main.js' import { Stepper, easing, Ease } from '../../../src/animation/Controller.js' const { objectContaining, arrayContaining, any } = jasmine describe('Morphable.js', () => { describe('()', () => { it('sets a default stepper', () => { const morpher = new Morphable() expect(morpher.stepper().ease).toBe(easing['-']) }) it('sets the passed stepper', () => { const ease = new Ease() const morpher = new Morphable(ease) expect(morpher.stepper()).toBe(ease) }) }) describe('constructors', () => { it('Morphable with SVGNumber', () => { const morpher = new Morphable().from(10).to(5) expect(morpher).toEqual(any(Morphable)) expect(morpher.type()).toBe(SVGNumber) expect(morpher.at(0.5)).toEqual(any(SVGNumber)) expect(morpher.at(0.5).valueOf()).toBe(7.5) }) it('Morphable with String', () => { const morpher = new Morphable().from('foo').to('bar') expect(morpher).toEqual(any(Morphable)) expect(morpher.type()).toBe(NonMorphable) expect(morpher.at(0.5)).toEqual(any(NonMorphable)) expect(morpher.at(0.5).valueOf()).toBe('foo') expect(morpher.at(1).valueOf()).toBe('bar') }) it('Morphable with Object', () => { const morpher = new Morphable().from({ a: 5, b: 10 }).to({ a: 10, b: 20 }) expect(morpher).toEqual(any(Morphable)) expect(morpher.type()).toBe(ObjectBag) expect(morpher.at(0.5)).toEqual(any(Object)) expect(morpher.at(0.5).valueOf()).toEqual( objectContaining({ a: new SVGNumber(7.5), b: new SVGNumber(15) }) ) }) it('Morphable from object containing css values', () => { const morpher = new Morphable() .from({ opacity: '0', 'stroke-width': '10px' }) .to({ opacity: 1, 'stroke-width': 20 }) expect(morpher).toEqual(any(Morphable)) expect(morpher.type()).toBe(ObjectBag) expect(morpher.at(0.5)).toEqual(any(Object)) expect(morpher.at(0.5).valueOf()).toEqual( objectContaining({ opacity: new SVGNumber(0.5), 'stroke-width': new SVGNumber('15px') }) ) }) it('Creates a morphable out of an SVGNumber', () => { const morpher = new SVGNumber(5).to(10) expect(morpher).toEqual(any(Morphable)) expect(morpher.type()).toBe(SVGNumber) expect(morpher.at(0.5)).toEqual(any(SVGNumber)) expect(morpher.at(0.5).valueOf()).toBe(7.5) }) it('Creates a morphable out of an Color', () => { const morpher = new Color('#fff').to('#000') expect(morpher).toEqual(any(Morphable)) expect(morpher.type()).toBe(Color) expect(morpher.at(0.5)).toEqual(any(Color)) expect(morpher.at(0.5).toHex()).toBe('#808080') }) it('Creates a morphable out of an Box', () => { const morpher = new Box(1, 2, 3, 4).to([5, 6, 7, 8]) expect(morpher).toEqual(any(Morphable)) expect(morpher.type()).toBe(Box) expect(morpher.at(0.5)).toEqual(any(Box)) expect(morpher.at(0.5)).toEqual( objectContaining({ x: 3, y: 4, width: 5, height: 6 }) ) }) it('Creates a morphable out of an Matrix', () => { const morpher = new Matrix(1, 2, 3, 4, 5, 6).to([3, 4, 5, 6, 7, 8]) expect(morpher).toEqual(any(Morphable)) expect(morpher.type()).toBe(Matrix) expect(morpher.at(0.5)).toEqual(any(Matrix)) expect(morpher.at(0.5)).toEqual( objectContaining(new Matrix(2, 3, 4, 5, 6, 7)) ) }) it('Creates a morphable out of an SVGArray', () => { const morpher = new SVGArray([1, 2, 3, 4, 5, 6]).to([3, 4, 5, 6, 7, 8]) expect(morpher).toEqual(any(Morphable)) expect(morpher.type()).toBe(SVGArray) expect(morpher.at(0.5)).toEqual(any(SVGArray)) expect(morpher.at(0.5).toArray()).toEqual( arrayContaining([2, 3, 4, 5, 6, 7]) ) }) it('Creates a morphable out of an PointArray', () => { const morpher = new PointArray([1, 2, 3, 4, 5, 6]).to([3, 4, 5, 6, 7, 8]) expect(morpher).toEqual(any(Morphable)) expect(morpher.type()).toBe(PointArray) expect(morpher.at(0.5)).toEqual(any(PointArray)) expect(morpher.at(0.5).toArray()).toEqual( arrayContaining([2, 3, 4, 5, 6, 7]) ) }) it('Creates a morphable out of an PathArray', () => { const morpher = new PathArray(['M', 1, 2, 'L', 3, 4, 'L', 5, 6]).to([ 'M', 3, 4, 'L', 5, 6, 'L', 7, 8 ]) expect(morpher).toEqual(any(Morphable)) expect(morpher.type()).toBe(PathArray) expect(morpher.at(0.5)).toEqual(any(PathArray)) expect(morpher.at(0.5).toArray()).toEqual( arrayContaining(['M', 2, 3, 'L', 4, 5, 'L', 6, 7]) ) }) it('creates a morphable from unmorphable types', () => { const morpher = new Morphable().from('Hallo').to('Welt') expect(morpher).toEqual(any(Morphable)) expect(morpher.type()).toBe(NonMorphable) expect(morpher.at(0.5)).toEqual(any(NonMorphable)) expect(morpher.at(0.5).valueOf()).toBe('Hallo') expect(morpher.at(1).valueOf()).toBe('Welt') }) it('Creates a morphable out of an TransformBag', () => { const morpher = new TransformBag({ rotate: 0, translateX: 0 }).to({ rotate: 50, translateX: 20 }) expect(morpher).toEqual(any(Morphable)) expect(morpher.type()).toBe(TransformBag) expect(morpher.at(0.5)).toEqual(any(TransformBag)) expect(morpher.at(0.5)).toEqual( objectContaining({ rotate: 25, translateX: 10 }) ) }) it('Creates a morphable out of an ObjectBag', () => { const morpher = new ObjectBag({ a: 5, b: 10 }).to({ a: 10, b: 20 }) expect(morpher).toEqual(any(Morphable)) expect(morpher.type()).toBe(ObjectBag) expect(morpher.at(0.5)).toEqual(any(Object)) expect(morpher.at(0.5).valueOf()).toEqual( objectContaining({ a: new SVGNumber(7.5), b: new SVGNumber(15) }) ) }) it('creates a morphable from a color string', () => { let morpher = new Morphable().from('#fff').to('#000') expect(morpher).toEqual(any(Morphable)) expect(morpher.type()).toBe(Color) expect(morpher.at(0.5)).toEqual(any(Color)) expect(morpher.at(0.5).toHex()).toBe('#808080') morpher = new Morphable().from('rgb(255,255,255)').to('rgb(0,0,0)') expect(morpher).toEqual(any(Morphable)) expect(morpher.type()).toBe(Color) expect(morpher.at(0.5)).toEqual(any(Color)) expect(morpher.at(0.5).toHex()).toBe('#808080') }) it('creates a morphable from path string', () => { const morpher = new Morphable().from('M 0 0 L 10 10').to('M 0 0 L 20 20') expect(morpher).toEqual(any(Morphable)) expect(morpher.type()).toBe(PathArray) expect(morpher.at(0.5)).toEqual(any(PathArray)) expect(morpher.at(0.5).toString()).toBe('M0 0L15 15 ') }) it('creates a morphable from number string', () => { let morpher = new Morphable().from('10').to('20') expect(morpher).toEqual(any(Morphable)) expect(morpher.type()).toBe(SVGNumber) expect(morpher.at(0.5)).toEqual(any(SVGNumber)) expect(morpher.at(0.5).toString()).toBe('15') morpher = new Morphable().from('10px').to('20px') expect(morpher).toEqual(any(Morphable)) expect(morpher.type()).toBe(SVGNumber) expect(morpher.at(0.5)).toEqual(any(SVGNumber)) expect(morpher.at(0.5).toString()).toBe('15px') }) it('creates a morphable from delimited string', () => { const morpher = new Morphable().from(' 0 1, 2 , 3 ').to('4,5,6,7') expect(morpher).toEqual(any(Morphable)) expect(morpher.type()).toBe(SVGArray) expect(morpher.at(0.5)).toEqual(any(SVGArray)) expect(morpher.at(0.5)).toEqual([2, 3, 4, 5]) }) it('creates a morphable from an array', () => { const morpher = new Morphable().from([0, 1, 2, 3]).to([4, 5, 6, 7]) expect(morpher).toEqual(any(Morphable)) expect(morpher.type()).toBe(SVGArray) expect(morpher.at(0.5)).toEqual(any(SVGArray)) expect(morpher.at(0.5)).toEqual([2, 3, 4, 5]) }) it('converts the to-color to the from-type', () => { const morpher = new Color('#fff').to(new Color(1, 2, 3, 'hsl')) expect(new Color(morpher.from()).space).toBe('rgb') expect(morpher.at(0.5).space).toBe('rgb') }) it('converts the from-color to the to-type', () => { const morpher = new Morphable().to(new Color(1, 2, 3, 'hsl')).from('#fff') expect(new Color(morpher.from()).space).toBe('hsl') expect(morpher.at(0.5).space).toBe('hsl') }) }) describe('from()', () => { it('sets the type of the runner', () => { const morpher = new Morphable().from(5) expect(morpher.type()).toBe(SVGNumber) }) it('sets the from attribute to an array representation of the morphable type', () => { const morpher = new Morphable().from(5) expect(morpher.from()).toEqual(arrayContaining([5])) }) }) describe('type()', () => { it('sets the type of the runner', () => { const morpher = new Morphable().type(SVGNumber) expect(morpher._type).toBe(SVGNumber) }) it('gets the type of the runner', () => { const morpher = new Morphable().type(SVGNumber) expect(morpher.type()).toBe(SVGNumber) }) }) describe('to()', () => { it('sets the type of the runner', () => { const morpher = new Morphable().to(5) expect(morpher.type()).toBe(SVGNumber) }) it('sets the from attribute to an array representation of the morphable type', () => { const morpher = new Morphable().to(5) expect(morpher.to()).toEqual(arrayContaining([5])) }) }) describe('stepper()', () => { it('sets and gets the stepper of the Morphable', () => { const stepper = new Stepper() const morpher = new Morphable().stepper(stepper) expect(morpher.stepper()).toBe(stepper) }) }) describe('NonMorphable', () => { describe('()', () => { it('wraps any type into a NonMorphable from an array', () => { const non = new NonMorphable([5]) expect(non.valueOf()).toBe(5) }) it('wraps any type into a NonMorphable from any type', () => { expect(new NonMorphable(5).valueOf()).toBe(5) expect(new NonMorphable('Hello').valueOf()).toBe('Hello') }) }) describe('toArray()', () => { it('returns array representation of NonMorphable', () => { expect(new NonMorphable(5).toArray()).toEqual([5]) expect(new NonMorphable('Hello').toArray()).toEqual(['Hello']) }) }) }) describe('TransformBag', () => { describe('()', () => { it('creates an object which holds transformations for morphing by passing array', () => { const bag = new TransformBag([0, 1, 2, 3, 4, 5, 6, 7]) expect(bag.toArray()).toEqual([0, 1, 2, 3, 4, 5, 6, 7]) }) it('creates an object which holds transformations for morphing by passing object', () => { const bag = new TransformBag({ scaleX: 0, scaleY: 1, shear: 2, rotate: 3, translateX: 4, translateY: 5, originX: 6, originY: 7 }) expect(bag.toArray()).toEqual([0, 1, 2, 3, 4, 5, 6, 7]) }) }) describe('toArray()', () => { it('creates an array out of the transform values', () => { const bag = new TransformBag([0, 1, 2, 3, 4, 5, 6, 7]) expect(bag.toArray()).toEqual([0, 1, 2, 3, 4, 5, 6, 7]) }) }) }) describe('ObjectBag', () => { describe('()', () => { it('wraps an object into a morphable object by passing an array', () => { const bag = new ObjectBag([ 'foo', SVGNumber, 2, 1, '', 'bar', SVGNumber, 2, 2, '', 'baz', SVGNumber, 2, 3, '' ]) expect(bag.values).toEqual([ 'foo', SVGNumber, 2, 1, '', 'bar', SVGNumber, 2, 2, '', 'baz', SVGNumber, 2, 3, '' ]) }) it('wraps an object into a morphable object by passing an object', () => { const bag = new ObjectBag({ foo: 1, bar: 2, baz: 3 }) expect(bag.values).toEqual([ 'bar', SVGNumber, 2, 2, '', 'baz', SVGNumber, 2, 3, '', 'foo', SVGNumber, 2, 1, '' ]) }) it('wraps an object with morphable values in an ObjectBag', () => { const bag = new ObjectBag({ fill: new Color(), bar: 2 }) expect(bag.values).toEqual([ 'bar', SVGNumber, 2, 2, '', 'fill', Color, 5, 0, 0, 0, 0, 'rgb' ]) }) it('wraps an array with morphable representation in an ObjectBag', () => { const bag = new ObjectBag([ 'bar', SVGNumber, 2, 2, '', 'fill', Color, 5, 0, 0, 0, 0, 'rgb' ]) expect(bag.toArray()).toEqual([ 'bar', SVGNumber, 2, 2, '', 'fill', Color, 5, 0, 0, 0, 0, 'rgb' ]) }) }) describe('toArray()', () => { it('creates an array out of the object', () => { const bag = new ObjectBag({ foo: 1, bar: 2, baz: 3 }) expect(bag.toArray()).toEqual([ 'bar', SVGNumber, 2, 2, '', 'baz', SVGNumber, 2, 3, '', 'foo', SVGNumber, 2, 1, '' ]) }) it('creates a flattened array out of the object with morphable values', () => { const bag = new ObjectBag({ fill: new Color(), bar: 2 }) expect(bag.toArray()).toEqual([ 'bar', SVGNumber, 2, 2, '', 'fill', Color, 5, 0, 0, 0, 0, 'rgb' ]) }) }) describe('valueOf()', () => { it('creates morphable objects from the stored values', () => { const bag = new ObjectBag({ foo: 1, bar: 2, baz: 3 }) expect(bag.valueOf()).toEqual({ foo: new SVGNumber(1), bar: new SVGNumber(2), baz: new SVGNumber(3) }) }) it('creates also morphable objects from the stored values', () => { const bag = new ObjectBag({ fill: new Color(), bar: 2 }) expect(bag.valueOf()).toEqual({ fill: objectContaining(new Color()), bar: new SVGNumber(2) }) }) }) describe('align()', () => { it('aligns color spaces between two object bags', () => { const bag1 = new ObjectBag({ x: 1, y: '#fff' }) const bag2 = new ObjectBag({ x: 2, y: new Color().hsl() }) bag1.align(bag2.toArray()) expect(bag1.toArray()).toEqual([ 'x', SVGNumber, 2, 1, '', 'y', Color, 5, 0, 0, 100, 0, 'hsl' ]) }) }) }) }) svg.js-3.2.4/spec/spec/animation/Queue.js000066400000000000000000000047601463723416200202360ustar00rootroot00000000000000/* globals describe, expect, it */ import { Queue } from '../../../src/main.js' describe('Queue.js', function () { describe('first ()', function () { it('returns null if no item in the queue', function () { var queue = new Queue() expect(queue.first()).toEqual(null) }) it('returns the first value in the queue', function () { var queue = new Queue() queue.push(1) expect(queue.first()).toBe(1) queue.push(2) expect(queue.first()).toBe(1) }) }) describe('last ()', function () { it('returns null if no item in the queue', function () { var queue = new Queue() expect(queue.last()).toEqual(null) }) it('returns the last value added', function () { var queue = new Queue() queue.push(1) expect(queue.last()).toBe(1) queue.push(2) expect(queue.last()).toBe(2) }) }) describe('push ()', function () { it('adds an element to the end of the queue', function () { var queue = new Queue() queue.push(1) queue.push(2) queue.push(3) expect(queue.first()).toBe(1) expect(queue.last()).toBe(3) }) it('adds an item to the end of the queue', function () { var queue = new Queue() queue.push(1) const item = queue.push(2) queue.push(3) queue.remove(item) queue.push(item) expect(queue.first()).toBe(1) expect(queue.last()).toBe(2) }) }) describe('remove ()', function () { it('removes the given item from the queue', function () { var queue = new Queue() queue.push(1) queue.push(2) var item = queue.push(3) queue.remove(item) expect(queue.last()).toBe(2) expect(queue.first()).toBe(1) }) it('removes the given item from the queue', function () { var queue = new Queue() var item = queue.push(1) queue.push(2) queue.push(3) queue.remove(item) expect(queue.last()).toBe(3) expect(queue.first()).toBe(2) }) }) describe('shift ()', function () { it('returns nothing if queue is empty', function () { var queue = new Queue() var val = queue.shift() expect(val).toBeFalsy() }) it('returns the first item of the queue and removes it', function () { var queue = new Queue() queue.push(1) queue.push(2) queue.push(3) var val = queue.shift() expect(queue.last()).toBe(3) expect(queue.first()).toBe(2) expect(val).toBe(1) }) }) }) svg.js-3.2.4/spec/spec/animation/Runner.js000066400000000000000000002106261463723416200204230ustar00rootroot00000000000000/* globals describe, expect, it, beforeEach, afterEach, spyOn, jasmine */ import { Runner, defaults, Ease, Controller, SVG, Timeline, Rect, Morphable, Animator, Queue, Matrix, Color, Box, Polygon, PointArray } from '../../../src/main.js' import { FakeRunner, RunnerArray } from '../../../src/animation/Runner.js' import { getWindow } from '../../../src/utils/window.js' import SVGNumber from '../../../src/types/SVGNumber.js' const { any, createSpy, objectContaining, arrayContaining } = jasmine describe('Runner.js', () => { describe('Runner', () => { var initFn = createSpy('initFn') var runFn = createSpy('runFn') beforeEach(() => { jasmine.RequestAnimationFrame.install(getWindow()) Animator.timeouts = new Queue() Animator.frames = new Queue() Animator.immediates = new Queue() Animator.nextDraw = null initFn.calls.reset() runFn.calls.reset() }) afterEach(() => { jasmine.RequestAnimationFrame.uninstall(getWindow()) }) describe('sanitise()', () => { it('can handle all form of input', () => { var fn = Runner.sanitise expect(fn(200, 200, 'now')).toEqual( objectContaining({ duration: 200, delay: 200, when: 'now', times: 1, wait: 0, swing: false }) ) expect(fn(200, 200)).toEqual( objectContaining({ duration: 200, delay: 200, when: 'last', times: 1, wait: 0, swing: false }) ) expect(fn(200)).toEqual( objectContaining({ duration: 200, delay: defaults.timeline.delay, when: 'last', times: 1, wait: 0, swing: false }) ) expect(fn(runFn)).toEqual( objectContaining({ duration: runFn, delay: defaults.timeline.delay, when: 'last', times: 1, wait: 0, swing: false }) ) expect(fn({ delay: 200 })).toEqual( objectContaining({ duration: defaults.timeline.duration, delay: 200, when: 'last', times: 1, wait: 0, swing: false }) ) expect( fn({ times: 3, delay: 200, when: 'now', swing: true, wait: 200 }) ).toEqual( objectContaining({ duration: defaults.timeline.duration, delay: 200, when: 'now', times: 3, wait: 200, swing: true }) ) }) }) describe('())', () => { it('creates a runner with defaults', () => { var runner = new Runner() expect(runner instanceof Runner).toBe(true) expect(runner._duration).toBe(defaults.timeline.duration) expect(runner._stepper instanceof Ease).toBe(true) }) it('creates a runner with duration set', () => { var runner = new Runner(1000) expect(runner instanceof Runner).toBe(true) expect(runner._duration).toBe(1000) expect(runner._stepper instanceof Ease).toBe(true) }) it('creates a runner with controller set', () => { var runner = new Runner(runFn) expect(runner instanceof Runner).toBe(true) expect(runner._duration).toBeFalsy() expect(runner._stepper instanceof Controller).toBe(true) }) }) describe('queue()', () => { it('adds another closure to the runner', () => { var runner = new Runner() runner.queue(initFn, runFn, true) expect(runner._queue[0]).toEqual( objectContaining({ initialiser: initFn, initialised: false, runner: runFn, finished: false }) ) }) }) describe('step()', () => { it('returns itself', () => { var runner = new Runner() expect(runner.step()).toBe(runner) }) it('does nothing when not active', () => { const runner = new Runner().active(false) const frozen = Object.freeze(runner) expect(frozen.step()).toEqual(runner) }) it('calls initFn once and runFn at every step', () => { var runner = new Runner() runner.queue(initFn, runFn, false) runner.step() expect(initFn).toHaveBeenCalled() expect(runFn).toHaveBeenCalled() runner.step() expect(initFn.calls.count()).toBe(1) expect(runFn.calls.count()).toBe(2) }) it('calls initFn on every step if its declarative', () => { var runner = new Runner(new Controller()) runner.queue(initFn, runFn, true) runner.step() expect(initFn).toHaveBeenCalled() expect(runFn).toHaveBeenCalled() runner.step() expect(initFn.calls.count()).toBe(2) expect(runFn.calls.count()).toBe(2) }) function getLoop(r) { var loopDuration = r._duration + r._wait var loopsDone = Math.floor(r._time / loopDuration) return loopsDone } // step in time it('steps forward a certain time', () => { var spy = createSpy('stepper') var r = new Runner(1000).loop(10, false, 100) r.queue(null, spy) r.step(300) // should be 0.3s expect(spy).toHaveBeenCalledWith(0.3) expect(getLoop(r)).toBe(0) r.step(300) // should be 0.6s expect(spy).toHaveBeenCalledWith(0.6) expect(getLoop(r)).toBe(0) r.step(600) // should be 0.1s expect(spy).toHaveBeenCalledWith(0.1) expect(getLoop(r)).toBe(1) r.step(-300) // should be 0.9s expect(spy).toHaveBeenCalledWith(0.9) expect(getLoop(r)).toBe(0) r.step(2000) // should be 0.7s expect(spy).toHaveBeenCalledWith(0.7) expect(getLoop(r)).toBe(2) r.step(-2000) // should be 0.9s expect(spy).toHaveBeenCalledWith(0.9) expect(getLoop(r)).toBe(0) }) it('handles dts which are bigger than the animation time', () => { var runner = new Runner(1000) runner.queue(initFn, runFn, true) runner.step(1100) expect(initFn).toHaveBeenCalled() expect(runFn).toHaveBeenCalledWith(1) }) describe('looping', () => { describe('without wait', () => { describe('unreversed', () => { describe('nonswinging', () => { it('does behave correctly at the end of an even loop', () => { var spy = createSpy('stepper') var runner = new Runner(1000).loop(6, false) runner.queue(null, spy) runner.step(5750) expect(spy).toHaveBeenCalledWith(0.75) runner.step(250) expect(spy).toHaveBeenCalledWith(1) }) it('does behave correctly at the end of an uneven loop', () => { var spy = createSpy('stepper') var runner = new Runner(1000).loop(5, false) runner.queue(null, spy) runner.step(4750) expect(spy).toHaveBeenCalledWith(0.75) runner.step(250) expect(spy).toHaveBeenCalledWith(1) }) }) describe('swinging', () => { it('does behave correctly at the end of an even loop', () => { var spy = createSpy('stepper') var runner = new Runner(1000).loop(6, true) runner.queue(null, spy) runner.step(5750) expect(spy).toHaveBeenCalledWith(0.25) runner.step(250) expect(spy).toHaveBeenCalledWith(0) }) it('does behave correctly at the end of an uneven loop', () => { var spy = createSpy('stepper') var runner = new Runner(1000).loop(5, true) runner.queue(null, spy) runner.step(4750) expect(spy).toHaveBeenCalledWith(0.75) runner.step(250) expect(spy).toHaveBeenCalledWith(1) }) }) }) describe('reversed', () => { describe('nonswinging', () => { it('does behave correctly at the end of an even loop', () => { var spy = createSpy('stepper') var runner = new Runner(1000).loop(6, false).reverse() runner.queue(null, spy) runner.step(5750) expect(spy).toHaveBeenCalledWith(0.25) runner.step(250) expect(spy).toHaveBeenCalledWith(0) }) it('does behave correctly at the end of an uneven loop', () => { var spy = createSpy('stepper') var runner = new Runner(1000).loop(5, false).reverse() runner.queue(null, spy) runner.step(4750) expect(spy).toHaveBeenCalledWith(0.25) runner.step(250) expect(spy).toHaveBeenCalledWith(0) }) }) describe('swinging', () => { it('does behave correctly at the end of an even loop', () => { var spy = createSpy('stepper') var runner = new Runner(1000).loop(6, true).reverse() runner.queue(null, spy) runner.step(5750) expect(spy).toHaveBeenCalledWith(0.75) runner.step(250) expect(spy).toHaveBeenCalledWith(1) }) it('does behave correctly at the end of an uneven loop', () => { var spy = createSpy('stepper') var runner = new Runner(1000).loop(5, true).reverse() runner.queue(null, spy) runner.step(4750) expect(spy).toHaveBeenCalledWith(0.25) runner.step(250) expect(spy).toHaveBeenCalledWith(0) }) }) }) }) describe('with wait', () => { describe('unreversed', () => { describe('nonswinging', () => { it('does behave correctly at the end of an even loop', () => { var spy = createSpy('stepper') var runner = new Runner(1000).loop(6, false, 100) runner.queue(null, spy) runner.step(5450) expect(spy).toHaveBeenCalledWith(1) spy.calls.reset() runner.step(800) expect(spy).toHaveBeenCalledWith(0.75) runner.step(250) expect(spy).toHaveBeenCalledWith(1) }) it('does behave correctly at the end of an uneven loop', () => { var spy = createSpy('stepper') var runner = new Runner(1000).loop(5, false, 100) runner.queue(null, spy) runner.step(4350) expect(spy).toHaveBeenCalledWith(1) spy.calls.reset() runner.step(800) expect(spy).toHaveBeenCalledWith(0.75) runner.step(250) expect(spy).toHaveBeenCalledWith(1) }) }) describe('swinging', () => { it('does behave correctly at the end of an even loop', () => { var spy = createSpy('stepper') var runner = new Runner(1000).loop(6, true, 100) runner.queue(null, spy) runner.step(5450) expect(spy).toHaveBeenCalledWith(1) spy.calls.reset() runner.step(800) expect(spy).toHaveBeenCalledWith(0.25) runner.step(250) expect(spy).toHaveBeenCalledWith(0) }) it('does behave correctly at the end of an uneven loop', () => { var spy = createSpy('stepper') var runner = new Runner(1000).loop(5, true, 100) runner.queue(null, spy) runner.step(4350) expect(spy).toHaveBeenCalledWith(0) spy.calls.reset() runner.step(800) expect(spy).toHaveBeenCalledWith(0.75) runner.step(250) expect(spy).toHaveBeenCalledWith(1) }) }) }) describe('reversed', () => { describe('nonswinging', () => { it('does behave correctly at the end of an even loop', () => { var spy = createSpy('stepper') var runner = new Runner(1000).loop(6, false, 100).reverse() runner.queue(null, spy) runner.step(5450) expect(spy).toHaveBeenCalledWith(0) spy.calls.reset() runner.step(800) expect(spy).toHaveBeenCalledWith(0.25) runner.step(250) expect(spy).toHaveBeenCalledWith(0) }) it('does behave correctly at the end of an uneven loop', () => { var spy = createSpy('stepper') var runner = new Runner(1000).loop(5, false, 100).reverse() runner.queue(null, spy) runner.step(4350) expect(spy).toHaveBeenCalledWith(0) spy.calls.reset() runner.step(800) expect(spy).toHaveBeenCalledWith(0.25) runner.step(250) expect(spy).toHaveBeenCalledWith(0) }) }) describe('swinging', () => { it('does behave correctly at the end of an even loop', () => { var spy = createSpy('stepper') var runner = new Runner(1000).loop(6, true, 100).reverse() runner.queue(null, spy) runner.step(5450) expect(spy).toHaveBeenCalledWith(0) spy.calls.reset() runner.step(800) expect(spy).toHaveBeenCalledWith(0.75) runner.step(250) expect(spy).toHaveBeenCalledWith(1) }) it('does behave correctly at the end of an uneven loop', () => { var spy = createSpy('stepper') var runner = new Runner(1000).loop(5, true, 100).reverse() runner.queue(null, spy) runner.step(4350) expect(spy).toHaveBeenCalledWith(1) spy.calls.reset() runner.step(800) expect(spy).toHaveBeenCalledWith(0.25) runner.step(250) expect(spy).toHaveBeenCalledWith(0) }) }) }) }) }) }) describe('active()', () => { it('acts as a getter without parameters', () => { var runner = new Runner() expect(runner.active()).toBe(true) }) it('disables the runner when false is passed', () => { var runner = new Runner() expect(runner.active(false)).toBe(runner) expect(runner.active()).toBe(false) }) it('enables the runner when true is passed', () => { var runner = new Runner() expect(runner.active(false)).toBe(runner) expect(runner.active(true)).toBe(runner) expect(runner.active()).toBe(true) }) }) describe('duration()', () => { it('return the full duration of the runner including all loops and waits', () => { var runner = new Runner(800).loop(10, true, 200) expect(runner.duration()).toBe(9800) }) }) describe('loop()', () => { it('makes this runner looping', () => { var runner = new Runner(1000).loop(5) expect(runner.duration()).toBe(5000) }) it('makes this runner indefinitey by passing true', () => { var runner = new Runner(1000).loop(true) expect(runner.duration()).toBe(Infinity) }) it('makes this runner indefinitey by passing nothing', () => { var runner = new Runner(1000).loop() expect(runner.duration()).toBe(Infinity) }) }) describe('time()', () => { it('returns itself', () => { var runner = new Runner() expect(runner.time(0)).toBe(runner) }) it('acts as a getter with no parameter passed', () => { var runner = new Runner() expect(runner.time()).toBe(0) }) it('reschedules the runner to a new time', () => { var runner = new Runner() runner.time(10) expect(runner.time()).toBe(10) }) it('calls step to reschedule', () => { var runner = new Runner() spyOn(runner, 'step') runner.time(10) expect(runner.step).toHaveBeenCalledWith(10) }) }) describe('loops()', () => { it('get the loops of a runner', () => { var spy = createSpy('stepper') var runner = new Runner(1000).queue(null, spy) runner.step(300) expect(spy).toHaveBeenCalledWith(0.3) expect(runner.loops()).toBe(0.3) }) it('sets the loops of the runner', () => { var spy = createSpy('stepper') var runner = new Runner(1000).queue(null, spy) expect(runner.loops(0.5).loops()).toBe(0.5) expect(spy).toHaveBeenCalledWith(0.5) expect(runner.loops(0.1).loops()).toBe(0.1) expect(spy).toHaveBeenCalledWith(0.1) expect(runner.loops(1.5).loops()).toBe(1) expect(spy).toHaveBeenCalledWith(1) }) it('sets the loops of the runner in a loop', () => { var spy = createSpy('stepper') var runner = new Runner(1000).loop(5, true, 500).queue(null, spy) expect(runner.loops(1.3).loops()).toBe(1.3) expect(spy).toHaveBeenCalledWith(0.7) expect(runner.loops(0.3).loops()).toBe(0.3) }) }) describe('progress()', () => { it('gets the progress of a runner', () => { var spy = createSpy('stepper') var runner = new Runner(1000).queue(null, spy) runner.step(300) expect(spy).toHaveBeenCalledWith(0.3) expect(runner.progress()).toBe(0.3) }) it('gets the progress of a runner when looping', () => { var spy = createSpy('stepper') var runner = new Runner(800).queue(null, spy).loop(10, false, 200) // duration should be 9800 // middle of animation, in the middle of wait time runner.step(4900) expect(runner.progress()).toBe(0.5) expect(spy).toHaveBeenCalledWith(1) // start of next loop runner.step(100) expect(spy).toHaveBeenCalledWith(0) // move 400 into current loop which is 0.5 progress // the progress value is 5400 / 9800 runner.step(400) expect(spy).toHaveBeenCalledWith(0.5) expect(runner.progress()).toBe(5400 / 9800) }) it('sets the progress of a runner', () => { var spy = createSpy('stepper') var runner = new Runner(1000).queue(null, spy) expect(runner.progress(0.5).progress()).toBe(0.5) expect(spy).toHaveBeenCalledWith(0.5) }) it('sets the progress of a runner when looping', () => { var spy = createSpy('stepper') var runner = new Runner(800).queue(null, spy).loop(10, false, 200) // progress 0.5 somewhere in the middle of wait time expect(runner.progress(0.5).progress()).toBe(0.5) expect(spy).toHaveBeenCalledWith(1) // start of next loop runner.step(100) expect(spy).toHaveBeenCalledWith(0) // should move 0.5 into the next loop expect(runner.progress(5400 / 9800).progress()).toBe(5400 / 9800) expect(spy.calls.mostRecent().args[0]).toBeCloseTo(0.5) }) }) describe('position()', () => { it('gets the position of a runner', () => { var spy = createSpy('stepper') var runner = new Runner(1000).queue(null, spy) runner.step(300) expect(spy).toHaveBeenCalledWith(0.3) expect(runner.position()).toBe(0.3) }) it('gets the position of a runner when looping', () => { var spy = createSpy('stepper') var runner = new Runner(1000).loop(5, true, 100).queue(null, spy) runner.step(1200) expect(spy).toHaveBeenCalledWith(0.9) expect(runner.position()).toBe(0.9) }) it('sets the position of a runner', () => { var spy = createSpy('stepper') var runner = new Runner(1000).queue(null, spy) expect(runner.position(0.5).position()).toBe(0.5) expect(spy).toHaveBeenCalledWith(0.5) }) it('sets the position of a runner in a loop', () => { var spy = createSpy('stepper') var runner = new Runner(1000).loop(5, true, 100).queue(null, spy) runner.step(1200) expect(runner.position(0.4).position()).toBe(0.4) expect(spy).toHaveBeenCalledWith(0.4) expect(runner.position(0).position()).toBe(0) expect(spy).toHaveBeenCalledWith(0) expect(runner.position(1).position()).toBe(1) expect(spy).toHaveBeenCalledWith(1) }) }) describe('element()', () => { it('returns the element bound to this runner if any', () => { var runner1 = new Runner() expect(runner1.element()).toBe(null) var element = SVG('') var runner2 = element.animate() expect(runner2.element()).toBe(element) }) it('sets an element to be bound to the runner', () => { var runner = new Runner() var element = SVG('') expect(runner.element(element)).toBe(runner) expect(runner.element()).toBe(element) }) }) describe('timeline()', () => { it('returns the timeline bound to this runner if any', () => { var runner1 = new Runner() expect(runner1.element()).toBe(null) var element = SVG('') var runner2 = element.animate() expect(runner2.timeline()).toBe(element.timeline()) }) it('sets a timeline to be bound to the runner', () => { var runner = new Runner() var timeline = new Timeline() expect(runner.timeline(timeline)).toBe(runner) expect(runner.timeline()).toBe(timeline) }) }) describe('schedule()', () => { it('schedules the runner on a timeline', () => { var runner = new Runner() var timeline = new Timeline() var spy = spyOn(timeline, 'schedule').and.callThrough() expect(runner.schedule(timeline, 200, 'now')).toBe(runner) expect(runner.timeline()).toBe(timeline) expect(spy).toHaveBeenCalledWith(runner, 200, 'now') }) it('schedules the runner on its own timeline', () => { var runner = new Runner() var timeline = new Timeline() var spy = spyOn(timeline, 'schedule') runner.timeline(timeline) expect(runner.schedule(200, 'now')).toBe(runner) expect(runner.timeline()).toBe(timeline) expect(spy).toHaveBeenCalledWith(runner, 200, 'now') }) it('throws if no timeline is given', () => { var runner = new Runner() expect(() => runner.schedule(200, 'now')).toThrowError( 'Runner cannot be scheduled without timeline' ) }) }) describe('unschedule()', () => { it('unschedules this runner from its timeline', () => { var runner = new Runner() var timeline = new Timeline() var spy = spyOn(timeline, 'unschedule').and.callThrough() expect(runner.schedule(timeline, 200, 'now')).toBe(runner) expect(runner.unschedule()).toBe(runner) expect(spy).toHaveBeenCalledWith(runner) expect(runner.timeline()).toBe(null) }) }) describe('animate()', () => { it('creates a new runner scheduled after the first', () => { var runner = new Runner(1000) var timeline = new Timeline() runner.schedule(timeline) var runner2 = runner.animate(500, 1000) var t = timeline.time() expect(runner2.timeline()).toBe(timeline) expect(runner2.time()).toBe(0) expect(timeline.schedule()).toEqual( arrayContaining([ objectContaining({ start: t, duration: 1000, end: t + 1000, runner: runner }), objectContaining({ start: t + 2000, duration: 500, end: t + 2500, runner: runner2 }) ]) ) }) it('reuses timeline and element of current runner', () => { const element = new Rect() const timeline = new Timeline() const runner = new Runner().element(element).timeline(timeline) const after = runner.animate() expect(after.timeline()).toBe(timeline) expect(after.element()).toBe(element) }) it('does not reuse element if not set', () => { const timeline = new Timeline() const runner = new Runner().timeline(timeline) const after = runner.animate() expect(after.element()).toBe(null) }) }) describe('delay()', () => { it('calls animate with delay parameters', () => { var runner = new Runner(1000) spyOn(runner, 'animate') runner.delay(500) expect(runner.animate).toHaveBeenCalledWith(0, 500) }) }) describe('during()', () => { it('returns itself', () => { var runner = new Runner() expect(runner.during(runFn)).toBe(runner) }) it('calls queue passing only a function to call on every step', () => { var runner = new Runner() spyOn(runner, 'queue') runner.during(runFn) expect(runner.queue).toHaveBeenCalledWith(null, runFn) }) }) describe('after()', () => { it('returns itself', () => { var runner = new Runner() expect(runner.after(runFn)).toBe(runner) }) it('binds a function to the after event', () => { var runner = new Runner() spyOn(runner, 'on') runner.after(runFn) expect(runner.on).toHaveBeenCalledWith('finished', runFn) }) }) describe('finish()', () => { it('returns itself', () => { var runner = new Runner() expect(runner.finish()).toBe(runner) }) it('calls step with Infinity as argument', () => { var runner = new Runner() spyOn(runner, 'step') runner.finish() expect(runner.step).toHaveBeenCalledWith(Infinity) }) }) describe('reverse()', () => { it('returns itself', () => { var runner = new Runner() expect(runner.reverse()).toBe(runner) }) it('reverses the runner', () => { var spy = createSpy('stepper') var runner = new Runner(1000).reverse().queue(null, spy) runner.step(750) expect(spy).toHaveBeenCalledWith(0.25) }) it('reverses the runner when true is passed', () => { var spy = createSpy('stepper') var runner = new Runner(1000).reverse(true).queue(null, spy) runner.step(750) expect(spy).toHaveBeenCalledWith(0.25) }) it('unreverses the runner when true is passed', () => { var spy = createSpy('stepper') var runner = new Runner(1000).reverse(false).queue(null, spy) runner.step(750) expect(spy).toHaveBeenCalledWith(0.75) }) }) describe('ease()', () => { it('returns itself', () => { var runner = new Runner() expect(runner.ease(() => {})).toBe(runner) }) it('creates an easing Controller from the easing function', () => { var runner = new Runner() runner.ease(() => {}) expect(runner._stepper instanceof Ease).toBe(true) }) }) describe('reset()', () => { it('resets the runner by setting it to time 0', () => { var runner = new Runner().step(16) expect(runner.time()).toBe(16) expect(runner.reset()).toBe(runner) expect(runner.time()).toBe(0) }) it('does not reset if already reset', () => { var runner = Object.freeze(new Runner().reset()) expect(runner.reset()).toBe(runner) }) }) describe('private Methods', () => { describe('_rememberMorpher()', () => { it('adds a morpher for a method to the runner', () => { const runner = new Runner() const morpher = new Morphable() runner._rememberMorpher('move', morpher) expect(runner._history.move).toEqual({ morpher, caller: undefined }) }) it('resumes the timeline in case this runner uses a controller', () => { const timeline = new Timeline() const spy = spyOn(timeline, 'play') const runner = new Runner(new Controller(() => 0)).timeline(timeline) const morpher = new Morphable() runner._rememberMorpher('move', morpher) expect(spy).toHaveBeenCalled() }) }) describe('_tryRetarget()', () => { it('tries to retarget a morpher for the animation and returns true', () => { const rect = new Rect().move(0, 0) const runner = rect.animate().move(10, 10) jasmine.RequestAnimationFrame.tick(16) expect(runner._tryRetarget('x', 20)).toBe(true) expect(runner._history.x.morpher.to()).toEqual([20, '']) }) it('throws away the morpher if it was not initialized yet and returns false', () => { const rect = new Rect().move(0, 0) const runner = rect.animate().move(10, 10) // In that case tryRetarget is not successful expect(runner._tryRetarget('x', 20)).toBe(false) }) it('does nothing if method was not found', () => { const rect = new Rect().move(0, 0) const runner = rect.animate().move(10, 10) jasmine.RequestAnimationFrame.tick(16) // In that case tryRetarget is not successful expect(runner._tryRetarget('foo', 20)).toBe(false) }) it('does only work with controller for transformations and uses retarget function when retargeting transformations', () => { const rect = new Rect() const runner = rect .animate(new Controller(() => 0)) .transform({ translate: [10, 10] }) jasmine.RequestAnimationFrame.tick(16) // In that case tryRetarget is not successful expect( runner._tryRetarget('transform', { translate: [20, 20] }) ).toBe(true) }) it('starts the timeline if retarget was successful', () => { const timeline = new Timeline() const rect = new Rect().move(0, 0).timeline(timeline) const runner = rect.animate().move(10, 10) jasmine.RequestAnimationFrame.tick(16) const spy = spyOn(timeline, 'play') expect(runner._tryRetarget('x', 20)).toBe(true) expect(runner._history.x.morpher.to()).toEqual([20, '']) expect(spy).toHaveBeenCalledTimes(1) }) }) describe('_initialise', () => { it('does nothing if false is passed', () => { const runner = Object.freeze(new Runner()) expect(runner._initialise(false)).toBe(undefined) }) it('does nothing if true is passed and runner is not declarative', () => { const runner = Object.freeze(new Runner()) expect(runner._initialise(true)).toBe(undefined) }) it('calls the initializer function on the queue when runner is declarative', () => { const runner = new Runner(() => 0).queue(initFn, runFn) runner._initialise() expect(initFn).toHaveBeenCalledTimes(1) }) it('calls the initializer function on the queue when true is passed and runner is not declarative', () => { const runner = new Runner().queue(initFn, runFn) runner._initialise(true) expect(initFn).toHaveBeenCalledTimes(1) }) it('does nothing if function is already initialized', () => { const runner = new Runner().queue(initFn, runFn) runner._initialise(true) runner._initialise(true) expect(initFn).toHaveBeenCalledTimes(1) }) }) describe('_run()', () => { it('runs each queued function for the position or dt given', () => { const runner = new Runner().queue(initFn, runFn) runner._run(16) expect(runFn).toHaveBeenCalledWith(16) }) it('returns true if all runners converged', () => { const spy = createSpy().and.returnValue(true) const runner = new Runner().queue(initFn, spy) expect(runner._run(16)).toBe(true) }) it('returns true if all runners finished', () => { const spy = createSpy().and.returnValue(true) const runner = new Runner(100).queue(initFn, spy) runner._run(200) expect(runner._run(1)).toBe(true) }) }) describe('addTransform()', () => { it('adds a transformation by multiplying', () => { const runner = new Runner() runner.addTransform({ translate: [10, 10] }) expect(runner.transforms).toEqual(new Matrix(1, 0, 0, 1, 10, 10)) }) }) describe('clearTransform()', () => { it('resets the transformations to identity', () => { const runner = new Runner() runner.addTransform({ translate: [10, 10] }) runner.clearTransform() expect(runner.transforms).toEqual(new Matrix()) }) }) describe('clearTransformsFromQueue', () => { it('deletes all functions from the queue which are transformations', () => { const runner = new Runner().queue(initFn, runFn) runner.transform({ translate: [10, 20] }) runner.clearTransformsFromQueue() expect(runner._queue.length).toBe(1) }) }) }) describe('Element', () => { describe('animate()', () => { it('creates a runner with the element set and schedules it on the timeline', () => { var element = SVG('') var runner = element.animate() expect(runner instanceof Runner) expect(runner.element()).toBe(element) expect(runner.timeline()).toBe(element.timeline()) expect(element.timeline().getLastRunnerInfo().runner).toBe(runner) }) }) describe('delay()', () => { it('calls animate with correct parameters', () => { var element = SVG('') spyOn(element, 'animate') element.delay(100, 'now') expect(element.animate).toHaveBeenCalledWith(0, 100, 'now') }) }) describe('_clearTransformRunnersBefore()', () => { it('calls clearBefore on the runner array', () => { const rect = new Rect() rect._prepareRunner() const spy = spyOn(rect._transformationRunners, 'clearBefore') rect._clearTransformRunnersBefore({ id: 1 }) expect(spy).toHaveBeenCalledWith(1) }) }) describe('_currentTransform()', () => { it('calculates the current transformation of this element', () => { const rect = new Rect() rect._prepareRunner() const runner1 = new Runner().addTransform({ translate: [10, 20] }) const runner2 = new Runner().addTransform({ rotate: 45 }) const runner3 = new Runner().addTransform({ translate: [10, 20] }) rect._addRunner(runner1) rect._addRunner(runner2) rect._addRunner(runner3) expect(rect._currentTransform(runner3)).toEqual( new Matrix({ translate: [10, 20] }).rotate(45).translate(10, 20) ) }) }) describe('_addRunner()', () => { it('adds a runner to the runner array of this element', () => { const rect = new Rect() rect._prepareRunner() const spy = spyOn(rect._transformationRunners, 'add') const runner = new Runner() rect._addRunner(runner) expect(spy).toHaveBeenCalledWith(runner) }) }) describe('_prepareRunner()', () => { it('adds a runner array to the element', () => { const rect = new Rect() expect(rect._transformationRunners).toBe(undefined) rect._prepareRunner() expect(rect._transformationRunners).toEqual(any(RunnerArray)) }) it('only adds it if no animation is in progress', () => { const rect = new Rect() expect(rect._transformationRunners).toBe(undefined) rect._prepareRunner() const arr = rect._transformationRunners rect._frameId = 1 rect._prepareRunner() expect(rect._transformationRunners).toBe(arr) }) }) }) describe('methods', () => { describe('attr()', () => { it('relays to styleAttr with "attr" as parameter', () => { const runner = new Runner() const spy = spyOn(runner, 'styleAttr') runner.attr(1, 2) expect(spy).toHaveBeenCalledWith('attr', 1, 2) }) }) describe('css()', () => { it('relays to styleAttr with "css" as parameter', () => { const runner = new Runner() const spy = spyOn(runner, 'styleAttr') runner.css(1, 2) expect(spy).toHaveBeenCalledWith('css', 1, 2) }) }) describe('styleAttr()', () => { it('adds a morpher for attr', () => { const runner = new Runner() runner.styleAttr('attr', 'x', 5) expect(runner._history.attr.morpher).toEqual(any(Morphable)) expect(runner._history.attr.morpher.to()).toEqual([ 'x', SVGNumber, 2, 5, '' ]) }) it('adds a morpher for css', () => { const runner = new Runner() runner.styleAttr('css', 'x', 5) expect(runner._history.css.morpher).toEqual(any(Morphable)) expect(runner._history.css.morpher.to()).toEqual([ 'x', SVGNumber, 2, 5, '' ]) }) it('adds init and run fn for execution when runner runs', () => { const element = new Rect().move(0, 0) const runner = new Runner(100).ease('-').element(element) runner.styleAttr('attr', 'x', 5) runner.step(50) expect(runner._history.attr.morpher.from()).toEqual([ 'x', SVGNumber, 2, 0, '' ]) expect(runner._history.attr.morpher.to()).toEqual([ 'x', SVGNumber, 2, 5, '' ]) expect(element.x()).toBe(2.5) }) it('it also works when the object contains other morphable values', () => { const element = new Rect().fill('#fff').stroke('#000') const runner = new Runner(100).ease('-').element(element) runner.styleAttr('attr', { fill: '#000', stroke: new Color('#fff') }) runner.step(50) expect(runner._history.attr.morpher.from()).toEqual([ 'fill', Color, 5, 255, 255, 255, 0, 'rgb', 'stroke', Color, 5, 0, 0, 0, 0, 'rgb' ]) expect(runner._history.attr.morpher.to()).toEqual([ 'fill', Color, 5, 0, 0, 0, 0, 'rgb', 'stroke', Color, 5, 255, 255, 255, 0, 'rgb' ]) const result = runner._history.attr.morpher.at(0.5).valueOf() expect(result.fill).toEqual(any(Color)) expect(result.stroke).toEqual(any(Color)) expect(result.fill.toArray()).toEqual([127.5, 127.5, 127.5, 0, 'rgb']) expect(result.stroke.toArray()).toEqual([ 127.5, 127.5, 127.5, 0, 'rgb' ]) }) it('it changes color space', () => { const element = new Rect().fill('#fff') const runner = new Runner(100).ease('-').element(element) runner.styleAttr('attr', { fill: new Color(100, 12, 12, 'hsl') }) runner.step(50) expect(runner._history.attr.morpher.from()).toEqual([ 'fill', Color, 5, 0, 0, 100, 0, 'hsl' ]) expect(runner._history.attr.morpher.to()).toEqual([ 'fill', Color, 5, 100, 12, 12, 0, 'hsl' ]) const result = runner._history.attr.morpher.at(0.5).valueOf() expect(result.fill).toEqual(any(Color)) expect(result.fill.toArray()).toEqual([50, 6, 56, 0, 'hsl']) expect(element.fill()).toBe('#969388') }) it('retargets if called two times with new key', () => { const element = new Rect().fill('#fff') const runner = new Runner(100).ease('-').element(element) runner.styleAttr('attr', { fill: new Color(100, 12, 12, 'hsl') }) runner.step(50) expect(element.fill()).toBe('#969388') runner.styleAttr('attr', { fill: new Color(100, 50, 50, 'hsl'), x: 50 }) runner.step(25) expect(element.fill()).toBe('#b1c37c') expect(element.x()).toBe(37.5) }) it('retargets if called two times without new key', () => { const element = new Rect().fill('#fff') const runner = new Runner(100).ease('-').element(element) runner.styleAttr('attr', { fill: new Color(100, 12, 12, 'hsl') }) runner.step(50) expect(element.fill()).toBe('#969388') runner.styleAttr('attr', { fill: new Color(100, 50, 50, 'hsl') }) runner.step(25) expect(element.fill()).toBe('#b1c37c') }) }) function closeTo(number, precision = 2) { return { /* * The asymmetricMatch function is required, and must return a boolean. */ asymmetricMatch: function (compareTo) { const factor = 10 ** precision return ( Math.round(~~(compareTo * factor) / factor) === Math.round(~~(number * factor) / factor) ) }, /* * The jasmineToString method is used in the Jasmine pretty printer, and will * be seen by the user in the message when a test fails. */ jasmineToString: function () { return ( '' ) } } } function equal(obj) { return { /* * The asymmetricMatch function is required, and must return a boolean. */ asymmetricMatch: function (compareTo) { if (!(compareTo instanceof obj.constructor)) return false const keys = Object.keys(obj) const difference = Object.keys(compareTo).filter( (el) => !keys.includes(el) ) if (difference.length) return false for (const key in obj) { if (obj[key] !== compareTo[key]) return false } return true }, /* * The jasmineToString method is used in the Jasmine pretty printer, and will * be seen by the user in the message when a test fails. */ jasmineToString: function () { return '' } } } describe('zoom()', () => { it('adds a zoom morpher to the queue', () => { const element = SVG().size(100, 100).viewbox(0, 0, 100, 100) const runner = new Runner(100).ease('-').element(element) runner.zoom(2, { x: 0, y: 0 }) runner.step(50) expect(runner._history.zoom.morpher.from()).toEqual([1, '']) expect(runner._history.zoom.morpher.to()).toEqual([2, '']) expect(element.zoom()).toBeCloseTo(1.5, 10) expect(element.viewbox().toArray()).toEqual([ 0, 0, closeTo(66.666, 3), closeTo(66.666, 3) ]) }) it('retargets if called twice', () => { const element = SVG().size(100, 100).viewbox(0, 0, 100, 100) const runner = new Runner(100).ease('-').element(element) runner.zoom(2, { x: 0, y: 0 }) runner.step(50) runner.zoom(4, { x: 0, y: 0 }) expect(runner._history.zoom.morpher.from()).toEqual([1, '']) expect(runner._history.zoom.morpher.to()).toEqual([4, '']) runner.step(25) expect(element.zoom()).toBeCloseTo(3.25, 10) expect(element.viewbox().toArray()).toEqual([ 0, 0, closeTo(30.769, 3), closeTo(30.769, 3) ]) }) }) describe('transform()', () => { it('does not retarget for non-declarative transformations', () => { const runner = new Runner() const spy = spyOn(runner, '_tryRetarget') runner.transform({ translate: [10, 20] }) expect(spy).not.toHaveBeenCalled() }) it('does not retarget for relative transformations', () => { const runner = new Runner(new Controller(() => 0)) const spy = spyOn(runner, '_tryRetarget') runner.transform({ translate: [10, 20] }, true) expect(spy).not.toHaveBeenCalled() }) it('does retarget for absolute declarative transformations', () => { const runner = new Runner(new Controller(() => 0)) const spy = spyOn(runner, '_tryRetarget') runner.transform({ translate: [10, 20] }) expect(spy).toHaveBeenCalled() }) it('calls queue with isTransform=true', () => { const runner = new Runner() const spy = spyOn(runner, 'queue') runner.transform({ translate: [10, 20] }) expect(spy).toHaveBeenCalledWith( any(Function), any(Function), any(Function), true ) }) it('steps an affine transformation correctly', () => { const element = new Rect() const runner = new Runner(100).ease('-').element(element) runner.transform({ translate: [10, 20], scale: 2, rotate: 90 }) runner.step(50) // transform sets an immediate callback to apply all merged transforms // when every runner had the chance to add its bit of transforms jasmine.RequestAnimationFrame.tick(1) expect(element.matrix().decompose()).toEqual( objectContaining({ translateX: 5, translateY: 10, scaleX: closeTo(1.5, 10), scaleY: closeTo(1.5), rotate: closeTo(45, 10) }) ) }) it('retargets an affine transformation correctly', () => { const element = new Rect() const runner = new Runner(() => 1).element(element) runner.transform({ translate: [10, 20], scale: 2, rotate: 90 }) runner.step(50) runner.transform({ scale: 2 }) // transform sets its to-target to the morpher in the initialisation step // because it depends on the from-target. Declaritive animation run the init-step // on every frame. That is why we step here to see the effect of our retargeting runner.step(25) expect(runner._history.transform.morpher.to()).toEqual([ 2, 2, 0, 0, 0, 0, 0, 0 ]) }) it('retargets an affine transformation correctly and sets new origin', () => { const element = new Rect() const runner = new Runner(() => 1).element(element) runner.transform({ translate: [10, 20], scale: 2, rotate: 90 }) runner.step(50) runner.transform({ scale: 2, origin: [10, 10] }) // transform sets its to-target to the morpher in the initialisation step // because it depends on the from-target. Declaritive animation run the init-step // on every frame. That is why we step here to see the effect of our retargeting runner.step(25) expect(runner._history.transform.morpher.to()).toEqual([ 2, 2, 0, 0, 0, 0, 10, 10 ]) }) it('steps multiple relative animations correctly', () => { const element = new Rect() const runner = new Runner(100).ease('-').element(element) runner.translate(10, 20).scale(2).rotate(45) runner.step(50) // transform sets an immediate callback to apply all merged transforms // when every runner had the chance to add its bit of transforms jasmine.RequestAnimationFrame.tick(1) // The origin is transformed with every expect(element.matrix()).toEqual( new Matrix().translate(5, 10).scale(1.5, 5, 10).rotate(22.5, 5, 10) ) }) it('steps multiple relative animations correctly from multiple runners', () => { const element = new Rect() const runner1 = new Runner(100).ease('-').element(element) const runner2 = new Runner(100).ease('-').element(element) const runner3 = new Runner(100).ease('-').element(element) runner1.translate(10, 20) runner2.scale(2) runner3.rotate(45) runner1.step(50) runner2.step(50) runner3.step(50) // transform sets an immediate callback to apply all merged transforms // when every runner had the chance to add its bit of transforms jasmine.RequestAnimationFrame.tick(1) // The origin is transformed with every expect(element.matrix()).toEqual( new Matrix().translate(5, 10).scale(1.5, 5, 10).rotate(22.5, 5, 10) ) }) it('absolute transformations correctly overwrite relatives', () => { const element = new Rect() const runner1 = new Runner(100).ease('-').element(element) const runner2 = new Runner(100).ease('-').element(element) const runner3 = new Runner(100).ease('-').element(element) runner1.translate(10, 20) runner2.transform({ scale: 2 }) runner3.rotate(45) runner1.step(50) runner2.step(50) runner3.step(50) // transform sets an immediate callback to apply all merged transforms // when every runner had the chance to add its bit of transforms jasmine.RequestAnimationFrame.tick(1) expect(runner1._queue.length).toBe(0) // The origin is transformed with every expect(element.matrix()).toEqual(new Matrix().scale(1.5).rotate(22.5)) }) it('correctly animates matrices directly', () => { const element = new Rect() const runner = new Runner(100).ease('-').element(element) runner.transform(new Matrix({ rotate: 90 })) runner.step(50) // transform sets an immediate callback to apply all merged transforms // when every runner had the chance to add its bit of transforms jasmine.RequestAnimationFrame.tick(1) // The origin is transformed with every expect(element.matrix()).toEqual( new Matrix(0.5, 0.5, -0.5, 0.5, 0, 0) ) }) it('correctly animates matrices affine', () => { const element = new Rect() const runner = new Runner(100).ease('-').element(element) runner.transform( Object.assign({ affine: true }, new Matrix({ rotate: 90 })) ) runner.step(50) // transform sets an immediate callback to apply all merged transforms // when every runner had the chance to add its bit of transforms jasmine.RequestAnimationFrame.tick(1) // The origin is transformed with every expect(element.matrix()).toEqual(new Matrix({ rotate: 45 })) }) it('correctly animates matrices affine by passing third parameter', () => { const element = new Rect() const runner = new Runner(100).ease('-').element(element) runner.transform(new Matrix({ rotate: 90 }), true, true) runner.step(50) // transform sets an immediate callback to apply all merged transforms // when every runner had the chance to add its bit of transforms jasmine.RequestAnimationFrame.tick(1) // The origin is transformed with every expect(element.matrix()).toEqual(new Matrix({ rotate: 45 })) }) it('correctly animates a declarative relative rotation', () => { const element = new Rect() const runner = new Runner(() => 1).element(element) runner.transform({ rotate: 90 }, true) runner.step(16) jasmine.RequestAnimationFrame.tick(1) runner.step(16) jasmine.RequestAnimationFrame.tick(1) expect(element.matrix()).not.toEqual(new Matrix()) }) }) describe('x()', () => { it('queues a numer', () => { const runner = new Runner() const spy = spyOn(runner, '_queueNumber') runner.x(10) expect(spy).toHaveBeenCalledWith('x', 10) }) }) describe('y()', () => { it('queues a numer', () => { const runner = new Runner() const spy = spyOn(runner, '_queueNumber') runner.y(10) expect(spy).toHaveBeenCalledWith('y', 10) }) }) describe('dx()', () => { it('queues a numer', () => { const runner = new Runner() const spy = spyOn(runner, '_queueNumberDelta') runner.dx(10) expect(spy).toHaveBeenCalledWith('x', 10) }) it('uses a delta of 0 by default', () => { const runner = new Runner() const spy = spyOn(runner, '_queueNumberDelta') runner.dx() expect(spy).toHaveBeenCalledWith('x', 0) }) }) describe('dy()', () => { it('queues a number', () => { const runner = new Runner() const spy = spyOn(runner, '_queueNumberDelta') runner.dy(10) expect(spy).toHaveBeenCalledWith('y', 10) }) it('uses a delta of 0 by default', () => { const runner = new Runner() const spy = spyOn(runner, '_queueNumberDelta') runner.dy() expect(spy).toHaveBeenCalledWith('y', 0) }) }) describe('dmove()', () => { it('calls dx and dy', () => { const runner = new Runner() const spy1 = spyOn(runner, 'dx').and.returnValue(runner) const spy2 = spyOn(runner, 'dy').and.returnValue(runner) runner.dmove(10, 20) expect(spy1).toHaveBeenCalledWith(10) expect(spy2).toHaveBeenCalledWith(20) }) }) describe('_queueNumberDelta', () => { it('queues a morpher of type SVGNumber', () => { const element = new Rect().x(10) const runner = new Runner(100).ease('-').element(element) runner._queueNumberDelta('x', 10) runner.step(50) expect(runner._history.x.morpher.type()).toEqual(SVGNumber) expect(runner._history.x.morpher.from()).toEqual([10, '']) expect(runner._history.x.morpher.to()).toEqual([20, '']) expect(element.x()).toBe(15) }) it('retargets correctly', () => { const element = new Rect().x(10) const runner = new Runner(100).ease('-').element(element) runner._queueNumberDelta('x', 10) runner.step(25) runner._queueNumberDelta('x', 20) expect(runner._history.x.morpher.to()).toEqual([30, '']) runner.step(25) expect(element.x()).toBe(20) }) }) describe('_queueObject', () => { it('queues a morphable object', () => { const element = new Rect().x(10) const runner = new Runner(100).ease('-').element(element) runner._queueObject('x', new SVGNumber(20)) runner.step(50) expect(runner._history.x.morpher.type()).toEqual(SVGNumber) expect(runner._history.x.morpher.from()).toEqual([10, '']) expect(runner._history.x.morpher.to()).toEqual([20, '']) expect(element.x()).toBe(15) }) it('queues a morphable primitive', () => { const element = new Rect().fill('#000') const runner = new Runner(100).ease('-').element(element) runner._queueObject('fill', '#fff') runner.step(50) expect(runner._history.fill.morpher.type()).toEqual(Color) expect(element.fill()).toBe('#808080') }) it('retargets correctly', () => { const element = new Rect().x(10) const runner = new Runner(100).ease('-').element(element) runner._queueObject('x', 20) runner.step(25) runner._queueObject('x', 30) runner.step(25) expect(element.x()).toBe(20) }) }) describe('_queueNumber', () => { it('queues an SVGNumber with _queueObject', () => { const runner = new Runner() const spy = spyOn(runner, '_queueObject') runner._queueNumber('x', 10) expect(spy).toHaveBeenCalledWith('x', equal(new SVGNumber(10))) }) }) describe('cy()', () => { it('queues a numer', () => { const runner = new Runner() const spy = spyOn(runner, '_queueNumber') runner.cy(10) expect(spy).toHaveBeenCalledWith('cy', 10) }) }) describe('cx()', () => { it('queues a numer', () => { const runner = new Runner() const spy = spyOn(runner, '_queueNumber') runner.cx(10) expect(spy).toHaveBeenCalledWith('cx', 10) }) }) describe('move()', () => { it('calls x and y', () => { const runner = new Runner() const spy1 = spyOn(runner, 'x').and.returnValue(runner) const spy2 = spyOn(runner, 'y').and.returnValue(runner) runner.move(10, 20) expect(spy1).toHaveBeenCalledWith(10) expect(spy2).toHaveBeenCalledWith(20) }) }) describe('center()', () => { it('calls cx and cy', () => { const runner = new Runner() const spy1 = spyOn(runner, 'cx').and.returnValue(runner) const spy2 = spyOn(runner, 'cy').and.returnValue(runner) runner.center(10, 20) expect(spy1).toHaveBeenCalledWith(10) expect(spy2).toHaveBeenCalledWith(20) }) }) describe('size()', () => { it('calls width and height', () => { const runner = new Runner() const spy1 = spyOn(runner, 'width').and.returnValue(runner) const spy2 = spyOn(runner, 'height').and.returnValue(runner) runner.size(10, 20) expect(spy1).toHaveBeenCalledWith(10) expect(spy2).toHaveBeenCalledWith(20) }) it('figures out height if only width given', () => { const element = new Rect().size(10, 10) const runner = new Runner().element(element) const spy1 = spyOn(runner, 'width').and.returnValue(runner) const spy2 = spyOn(runner, 'height').and.returnValue(runner) runner.size(20) expect(spy1).toHaveBeenCalledWith(20) expect(spy2).toHaveBeenCalledWith(20) }) it('figures out width if only height given', () => { const element = new Rect().size(10, 10) const runner = new Runner().element(element) const spy1 = spyOn(runner, 'width').and.returnValue(runner) const spy2 = spyOn(runner, 'height').and.returnValue(runner) runner.size(null, 20) expect(spy1).toHaveBeenCalledWith(20) expect(spy2).toHaveBeenCalledWith(20) }) }) describe('width()', () => { it('queues a numer', () => { const runner = new Runner() const spy = spyOn(runner, '_queueNumber') runner.width(10) expect(spy).toHaveBeenCalledWith('width', 10) }) }) describe('height()', () => { it('queues a numer', () => { const runner = new Runner() const spy = spyOn(runner, '_queueNumber') runner.height(10) expect(spy).toHaveBeenCalledWith('height', 10) }) }) describe('plot()', () => { it('queues a morphable array', () => { const element = new Polygon().plot([10, 10, 20, 20]) const runner = new Runner(100).ease('-').element(element) runner.plot(20, 20, 30, 30) runner.step(50) expect(runner._history.plot.morpher.from()).toEqual([10, 10, 20, 20]) expect(runner._history.plot.morpher.to()).toEqual([20, 20, 30, 30]) expect(element.array()).toEqual(new PointArray([15, 15, 25, 25])) }) it('retargets correctly', () => { const element = new Polygon().plot([10, 10, 20, 20]) const runner = new Runner(100).ease('-').element(element) runner.plot(20, 20, 30, 30) runner.step(25) runner.plot(30, 30, 40, 40) runner.step(25) expect(runner._history.plot.morpher.from()).toEqual([10, 10, 20, 20]) expect(runner._history.plot.morpher.to()).toEqual([30, 30, 40, 40]) expect(element.array()).toEqual(new PointArray([20, 20, 30, 30])) }) }) describe('leading()', () => { it('queues a numer', () => { const runner = new Runner() const spy = spyOn(runner, '_queueNumber') runner.leading(10) expect(spy).toHaveBeenCalledWith('leading', 10) }) }) describe('viewbox()', () => { it('queues a numer', () => { const runner = new Runner() const spy = spyOn(runner, '_queueObject') runner.viewbox(10, 10, 100, 100) expect(spy).toHaveBeenCalledWith( 'viewbox', equal(new Box(10, 10, 100, 100)) ) }) }) describe('update()', () => { it('relays to attr call', () => { const runner = new Runner() const spy = spyOn(runner, 'attr') runner.update(0.5, '#fff', 1) expect(spy).toHaveBeenCalledWith('offset', 0.5) expect(spy).toHaveBeenCalledWith('stop-color', '#fff') expect(spy).toHaveBeenCalledWith('stop-opacity', 1) }) }) }) }) describe('FakeRunner', () => { describe('()', () => { it('creates a new FakeRunner with a new matrix which is always done', () => { const runner = new FakeRunner() expect(runner.transforms).toEqual(new Matrix()) expect(runner.id).toBe(-1) expect(runner.done).toBe(true) }) }) describe('mergeWith()', () => { it('merges the transformations of a runner with another and returns a FakeRunner', () => { const fake = new FakeRunner() const runner = new Runner().addTransform({ translate: [10, 20] }) const newRunner = fake.mergeWith(runner) expect(newRunner).toEqual(any(FakeRunner)) expect(newRunner.transforms).toEqual( new Matrix({ translate: [10, 20] }) ) }) }) }) describe('RunnerArray', () => { describe('add()', () => { it('adds a runner to the runner array', () => { const runner = new Runner() const arr = new RunnerArray() arr.add(runner) expect(arr.length()).toBe(1) }) it('does not add the same runner twice', () => { const runner = new Runner() const arr = new RunnerArray() arr.add(runner) arr.add(runner) expect(arr.length()).toBe(1) }) }) describe('getByID()', () => { it('returns a runner by its id', () => { const runner = new Runner() const arr = new RunnerArray() arr.add(runner) expect(arr.getByID(runner.id)).toBe(runner) }) }) describe('remove()', () => { it('removes a runner by its id', () => { const runner = new Runner() const arr = new RunnerArray() arr.add(runner) arr.remove(runner.id) expect(arr.length()).toBe(0) }) }) describe('merge()', () => { it('merges all runners which are done', () => { const runner1 = new Runner().addTransform({ translate: [10, 20] }) const runner2 = new Runner().addTransform({ rotate: 45 }) const runner3 = new Runner().addTransform({ translate: [10, 20] }) const arr = new RunnerArray() arr.add(runner1).add(runner2).add(runner3) runner1.done = true runner2.done = true runner3.done = true arr.merge() expect(arr.runners[0]).toEqual(any(FakeRunner)) expect(arr.runners[0].transforms).toEqual( new Matrix({ translate: [10, 20] }).rotate(45).translate(10, 20) ) }) it('skips runners which are not done', () => { const runner1 = new Runner().addTransform({ translate: [10, 20] }) const runner2 = new Runner().addTransform({ rotate: 45 }) const runner3 = new Runner().addTransform({ rotate: 45 }) const runner4 = new Runner().addTransform({ translate: [10, 20] }) const runner5 = new Runner().addTransform({ rotate: 45 }) const arr = new RunnerArray() arr.add(runner1).add(runner2).add(runner3).add(runner4).add(runner5) runner1.done = true runner2.done = true runner3.done = false runner4.done = true runner5.done = true arr.merge() expect(arr.runners[0]).toEqual(any(FakeRunner)) expect(arr.runners[0].transforms).toEqual( new Matrix({ translate: [10, 20] }).rotate(45) ) expect(arr.runners[2]).toEqual(any(FakeRunner)) expect(arr.runners[2].transforms).toEqual( new Matrix({ translate: [10, 20] }).rotate(45) ) expect(arr.runners[1]).toBe(runner3) }) it('skips runners which have a timeline and are scheduled on that timeline', () => { const runner1 = new Runner().addTransform({ translate: [10, 20] }) const runner2 = new Runner().addTransform({ rotate: 45 }) const runner3 = new Runner().addTransform({ rotate: 45 }) const runner4 = new Runner().addTransform({ translate: [10, 20] }) const runner5 = new Runner().addTransform({ rotate: 45 }) const arr = new RunnerArray() arr.add(runner1).add(runner2).add(runner3).add(runner4).add(runner5) runner1.done = true runner2.done = true runner3.done = true runner4.done = true runner5.done = true runner3.schedule(new Timeline()) arr.merge() expect(arr.runners[0]).toEqual(any(FakeRunner)) expect(arr.runners[0].transforms).toEqual( new Matrix({ translate: [10, 20] }).rotate(45) ) expect(arr.runners[2]).toEqual(any(FakeRunner)) expect(arr.runners[2].transforms).toEqual( new Matrix({ translate: [10, 20] }).rotate(45) ) expect(arr.runners[1]).toBe(runner3) }) }) describe('edit()', () => { it('replaces one runner with another', () => { const arr = new RunnerArray() const runner1 = new Runner() const runner2 = new Runner() arr.add(runner1) arr.edit(runner1.id, runner2) expect(arr.length()).toBe(1) expect(arr.runners[0]).toBe(runner2) }) }) describe('length()', () => { it('returns the number of runners in the array', () => { const arr = new RunnerArray().add(new Runner()).add(new Runner()) expect(arr.length()).toBe(2) }) }) describe('clearBefore', () => { it('removes all runners before a certain runner', () => { const runner1 = new Runner() const runner2 = new Runner() const runner3 = new Runner() const runner4 = new Runner() const runner5 = new Runner() const arr = new RunnerArray() arr.add(runner1).add(runner2).add(runner3).add(runner4).add(runner5) arr.clearBefore(runner3.id) expect(arr.length()).toBe(4) expect(arr.runners).toEqual([ any(FakeRunner), runner3, runner4, runner5 ]) }) }) }) }) svg.js-3.2.4/spec/spec/animation/Timeline.js000066400000000000000000000407201463723416200207140ustar00rootroot00000000000000/* globals describe, expect, it, beforeEach, afterEach, spyOn, container, jasmine */ import { Timeline, SVG, Runner, Animator, Queue, Rect } from '../../../src/main.js' import { getWindow } from '../../../src/utils/window.js' const { createSpy, any } = jasmine describe('Timeline.js', () => { beforeEach(() => { jasmine.RequestAnimationFrame.install(getWindow()) Animator.timeouts = new Queue() Animator.frames = new Queue() Animator.immediates = new Queue() Animator.nextDraw = null }) afterEach(() => { getWindow().cancelAnimationFrame(Animator.nextDraw) jasmine.RequestAnimationFrame.uninstall(getWindow()) }) describe('()', () => { it('creates a new Timeline with a default timesource', () => { const timeline = new Timeline() expect(timeline.source()).toEqual(any(Function)) }) it('creates a new Timeline with the passed timesource', () => { const source = createSpy() const timeline = new Timeline(source) expect(timeline.source()).toBe(source) }) }) describe('schedule()', () => { it('schedules a runner at the start of the queue with a default delay of 0', () => { const timeline = new Timeline() const runner = new Runner(1000) timeline.schedule(runner) expect(timeline._runners[0].start).toEqual(0) }) it('sets a reference of the timeline to the runner', () => { const timeline = new Timeline() const runner = new Runner(1000) timeline.schedule(runner) expect(runner.timeline()).toBe(timeline) }) it('schedules after when no when is past', () => { const timeline = new Timeline().schedule(new Runner(1000)) const runner = new Runner(1000) timeline.schedule(runner) expect(timeline._runners[1].start).toBe(1000) }) it('schedules after when when is last', () => { const timeline = new Timeline().schedule(new Runner(1000)) const runner = new Runner(1000) timeline.schedule(runner, 0, 'last') expect(timeline._runners[1].start).toBe(1000) }) it('schedules after when when is after', () => { const timeline = new Timeline().schedule(new Runner(1000)) const runner = new Runner(1000) timeline.schedule(runner, 0, 'after') expect(timeline._runners[1].start).toBe(1000) }) it('starts the animation right away when there is no runner to schedule after and when is after', () => { const timeline = new Timeline().time(100) const runner = new Runner(1000) timeline.schedule(runner, 0, 'after') expect(timeline._runners[0].start).toBe(100) }) it('schedules with start of the last runner when when is with-last', () => { const timeline = new Timeline().schedule(new Runner(1000), 200) const runner = new Runner(1000) timeline.schedule(runner, 0, 'with-last') expect(timeline._runners[1].start).toBe(200) }) it('starts the animation right away when there is no runner to schedule after and when is after', () => { const timeline = new Timeline().time(100) const runner = new Runner(1000) timeline.schedule(runner, 0, 'with-last') expect(timeline._runners[0].start).toBe(100) }) it('respects passed delay', () => { const timeline = new Timeline().schedule(new Runner(1000), 1000) const runner = new Runner(1000) timeline.schedule(runner, 0, 'after') expect(timeline._runners[1].start).toBe(2000) }) it('schedules the runner absolutely with absolute', () => { const timeline = new Timeline().schedule(new Runner(1000)) const runner = new Runner(1000) timeline.schedule(runner, 0, 'absolute') expect(timeline._runners[1].start).toBe(0) }) it('schedules the runner absolutely with start', () => { const timeline = new Timeline().schedule(new Runner(1000)) const runner = new Runner(1000) timeline.schedule(runner, 0, 'start') expect(timeline._runners[1].start).toBe(0) }) it('schedules the runner relatively to old start with relative', () => { const timeline = new Timeline() const runner = new Runner(1000) timeline.schedule(runner, 100).schedule(runner, 100, 'relative') expect(timeline._runners[0].start).toBe(200) }) it('schedules the runner as absolute if this runner was not on the timeline', () => { const timeline = new Timeline() const runner = new Runner(1000) timeline.schedule(runner, 100, 'relative') expect(timeline._runners[0].start).toBe(100) }) it('throws if when is not supported', () => { const timeline = new Timeline().schedule(new Runner(1000), 1000) const runner = new Runner(1000) expect(() => timeline.schedule(runner, 0, 'not supported')).toThrowError( 'Invalid value for the "when" parameter' ) }) it('uses persist value of the runner of present', () => { const timeline = new Timeline() const runner = new Runner(1000).persist(100) timeline.schedule(runner) expect(timeline._runners[0].persist).toBe(100) }) }) describe('unschedule()', () => { it('removes a runner from the timeline', () => { const timeline = new Timeline() const runner = new Runner(1000) timeline.schedule(runner).unschedule(runner) expect(runner.timeline()).toBe(null) expect(timeline._runners).toEqual([]) }) }) describe('getRunnerInfoById()', () => { it('gets a runner by its id from the timeline', () => { const timeline = new Timeline() const runner = new Runner(1000) expect( timeline.schedule(runner).getRunnerInfoById(runner.id).runner ).toBe(runner) }) it('returns null of runner not found', () => { const timeline = new Timeline() const runner = new Runner(1000) expect(timeline.getRunnerInfoById(runner.id)).toBe(null) }) }) describe('getLastRunnerInfo()', () => { it('gets a runner by its id from the timeline', () => { const timeline = new Timeline().schedule(new Runner(1000)) const runner = new Runner(1000) expect(timeline.schedule(runner).getLastRunnerInfo().runner).toBe(runner) }) }) describe('getEndTime()', () => { it('returns the end time of the runner which started last', () => { const timeline = new Timeline() const runner = new Runner(1000) const runner2 = new Runner(100) timeline.schedule(runner).schedule(runner2, 500, 'start') expect(timeline.getEndTime()).toBe(600) }) it('returns the timeline time if no runner is scheduled', () => { const timeline = new Timeline().time(100) expect(timeline.getEndTime()).toBe(100) }) }) describe('getEndTimeOfTimeline', () => { it('returns 0 if no runners are scheduled', () => { const timeline = new Timeline() const endTime = timeline.getEndTimeOfTimeline() expect(endTime).toEqual(0) }) it('returns the time all runners are finished', () => { const timeline = new Timeline() const runner = new Runner(1000) const runner2 = new Runner(100) timeline.schedule(runner).schedule(runner2, 500, 'start') expect(timeline.getEndTimeOfTimeline()).toBe(1000) }) }) describe('finish - issue #964', () => { let canvas beforeEach(() => { canvas = SVG().addTo(container) }) it('places all elements at the right position - single runner', () => { const timeline = new Timeline() const rect = canvas.rect(20, 20) rect.timeline(timeline) rect.animate().move(100, 200) timeline.finish() expect(rect.x()).toEqual(100) expect(rect.y()).toEqual(200) }) it('places all elements at the right position - runner that finishes latest is in first position', () => { const timeline = new Timeline() const rect1 = canvas.rect(10, 10) rect1.timeline(timeline) const rect2 = canvas.rect(10, 10) rect2.timeline(timeline) const rect3 = canvas.rect(10, 10) rect3.timeline(timeline) rect1.animate(2000, 0, 'now').move(100, 200) rect2.animate(1000, 0, 'now').move(100, 200) rect3.animate(1000, 500, 'now').move(100, 200) timeline.finish() expect(rect1.x()).toEqual(100) expect(rect1.y()).toEqual(200) expect(rect2.x()).toEqual(100) expect(rect2.y()).toEqual(200) expect(rect3.x()).toEqual(100) expect(rect3.y()).toEqual(200) }) it('places all elements at the right position - runner that finishes latest is in middle position', () => { const timeline = new Timeline() const rect1 = canvas.rect(10, 10) rect1.timeline(timeline) const rect2 = canvas.rect(10, 10) rect2.timeline(timeline) const rect3 = canvas.rect(10, 10) rect3.timeline(timeline) rect2.animate(1000, 0, 'now').move(100, 200) rect1.animate(2000, 0, 'now').move(100, 200) rect3.animate(1000, 500, 'now').move(100, 200) timeline.finish() expect(rect1.x()).toEqual(100) expect(rect1.y()).toEqual(200) expect(rect2.x()).toEqual(100) expect(rect2.y()).toEqual(200) expect(rect3.x()).toEqual(100) expect(rect3.y()).toEqual(200) }) it('places all elements at the right position - runner that finishes latest is in last position', () => { const timeline = new Timeline() const rect1 = canvas.rect(10, 10) rect1.timeline(timeline) const rect2 = canvas.rect(10, 10) rect2.timeline(timeline) const rect3 = canvas.rect(10, 10) rect3.timeline(timeline) rect2.animate(1000, 0, 'now').move(100, 200) rect3.animate(1000, 500, 'now').move(100, 200) rect1.animate(2000, 0, 'now').move(100, 200) timeline.finish() expect(rect1.x()).toEqual(100) expect(rect1.y()).toEqual(200) expect(rect2.x()).toEqual(100) expect(rect2.y()).toEqual(200) expect(rect3.x()).toEqual(100) expect(rect3.y()).toEqual(200) }) }) describe('updateTime()', () => { it('sets the time to the current time', () => { const timeline = new Timeline(() => 200).play() expect(timeline._lastSourceTime).toBe(200) }) }) describe('stop()', () => { it('sets the time to 0 and pauses the timeline', () => { const timeline = new Timeline().time(100) expect(timeline.stop().time()).toBe(0) expect(timeline._paused).toBe(true) }) }) describe('speed()', () => { it('gets or sets the speed of the timeline', () => { const timeline = new Timeline().speed(2) expect(timeline.speed()).toBe(2) }) }) describe('reverse()', () => { it('reverses the timeline with no parameter given', () => { const timeline = new Timeline().speed(2) const spy = spyOn(timeline, 'speed').and.callThrough() timeline.reverse() expect(spy).toHaveBeenCalledWith(-2) timeline.reverse() expect(spy).toHaveBeenCalledWith(2) }) it('reverses the timeline when true was passed', () => { const timeline = new Timeline().speed(2) const spy = spyOn(timeline, 'speed').and.callThrough() timeline.reverse(true) expect(spy).toHaveBeenCalledWith(-2) }) it('plays normal direction when false was passed', () => { const timeline = new Timeline().speed(-2) const spy = spyOn(timeline, 'speed').and.callThrough() timeline.reverse(false) expect(spy).toHaveBeenCalledWith(2) }) }) describe('seek()', () => { it('seeks the time by a given delta', () => { const timeline = new Timeline().time(100).seek(200) expect(timeline.time()).toBe(300) }) }) describe('time()', () => { it('gets and sets the current time of the timeline', () => { const timeline = new Timeline().time(100) expect(timeline.time()).toBe(100) }) }) describe('persist()', () => { it('gets and sets the persist property of the timeline', () => { const timeline = new Timeline().persist(true) expect(timeline.persist()).toBe(true) }) }) describe('source()', () => { it('gets or sets the time source of the timeline', () => { const source = () => 200 const timeline = new Timeline().source(source) expect(timeline.source()).toBe(source) }) }) describe('_stepFn', () => { it('does a step in the timeline and runs all runners', () => { const timeline = new Timeline() const runner = new Runner(1000) timeline.schedule(runner).play() // we have to play because its synchronous here jasmine.RequestAnimationFrame.tick(16) expect(runner.time()).toBe(16) }) it('doenst run runners which start later', () => { const timeline = new Timeline() const runner = new Runner(1000) timeline.schedule(runner, 100).play() // we have to play because its synchronous here jasmine.RequestAnimationFrame.tick(16) expect(runner.time()).toBe(0) }) it('reset runner if timeline was seeked backwards', () => { const timeline = new Timeline() const runner = new Runner(1000) timeline.schedule(runner) const spy = spyOn(runner, 'reset').and.callThrough() jasmine.RequestAnimationFrame.tick(1000) timeline.seek(-1000) expect(runner.time()).toBe(0) expect(spy).toHaveBeenCalled() }) it('does not run runners if they are not active', () => { const timeline = new Timeline() const runner = new Runner(1000).active(false) timeline.schedule(runner).play() // we have to play because its synchronous here jasmine.RequestAnimationFrame.tick(16) expect(runner.time()).toBe(0) }) it('unschedules runner if its finished', () => { const timeline = new Timeline() const runner = new Runner(1000) timeline.schedule(runner).play() // we have to play because its synchronous here jasmine.RequestAnimationFrame.tick(1000) jasmine.RequestAnimationFrame.tick(1) expect(runner.time()).toBe(1001) expect(timeline.getRunnerInfoById(runner.id)).toBe(null) }) it('does not unschedule if runner is persistent forever', () => { const timeline = new Timeline() const runner = new Runner(1000).persist(true) timeline.schedule(runner).play() // we have to play because its synchronous here jasmine.RequestAnimationFrame.tick(1000) jasmine.RequestAnimationFrame.tick(1) expect(runner.time()).toBe(1001) expect(timeline.getRunnerInfoById(runner.id)).not.toBe(null) }) it('does not unschedule if runner is persistent for a certain time', () => { const timeline = new Timeline() const runner = new Runner(1000).persist(100) timeline.schedule(runner).play() // we have to play because its synchronous here jasmine.RequestAnimationFrame.tick(1000) jasmine.RequestAnimationFrame.tick(1) expect(runner.time()).toBe(1001) expect(timeline.getRunnerInfoById(runner.id)).not.toBe(null) }) it('fires finish if no runners left', () => { const spy = createSpy() const timeline = new Timeline().on('finished', spy) const runner = new Runner(1000) spy.calls.reset() timeline.schedule(runner).play() // we have to play because its synchronous here jasmine.RequestAnimationFrame.tick(1000) jasmine.RequestAnimationFrame.tick(1) expect(spy).toHaveBeenCalled() }) it('continues if there are still runners left from us when going back in time', () => { const spy = createSpy() const timeline = new Timeline() .on('finished', spy) .time(1200) .reverse(true) const runner = new Runner(1000) spy.calls.reset() timeline.schedule(runner, 0).play() // we have to play because its synchronous here jasmine.RequestAnimationFrame.tick(1) expect(spy).not.toHaveBeenCalled() }) it('finishes if time is backwards and 0', () => { const spy = createSpy() const timeline = new Timeline().on('finished', spy).reverse(true) const runner = new Runner(1000) spy.calls.reset() timeline.schedule(runner, 0).play() // we have to play because its synchronous here jasmine.RequestAnimationFrame.tick(1) expect(spy).toHaveBeenCalled() }) }) describe('Element', () => { describe('timeline()', () => { it('sets and gets the timeline of the element', () => { const timeline = new Timeline() const rect = new Rect().timeline(timeline) expect(rect.timeline()).toBe(timeline) }) it('creates a timeline on the fly when getting it', () => { expect(new Rect().timeline()).toEqual(any(Timeline)) }) }) }) }) svg.js-3.2.4/spec/spec/elements/000077500000000000000000000000001463723416200164425ustar00rootroot00000000000000svg.js-3.2.4/spec/spec/elements/A.js000066400000000000000000000061221463723416200171610ustar00rootroot00000000000000/* globals describe, expect, it, jasmine */ import { A, G, Rect } from '../../../src/main.js' const { any } = jasmine const url = 'https://svgjs.dev' describe('A.js', () => { describe('()', () => { it('creates a new object of type A', () => { expect(new A()).toEqual(any(A)) }) it('sets passed attributes on the element', () => { expect(new A({ id: 'foo' }).id()).toBe('foo') }) }) describe('to()', () => { it('creates xlink:href attribute', () => { const link = new A() link.to(url) expect(link.attr('href')).toBe(url) }) }) describe('target()', () => { it('creates target attribute', () => { const link = new A() link.target('_blank') expect(link.attr('target')).toBe('_blank') }) }) describe('Container', () => { describe('link()', () => { it('creates a link with given url', () => { const group = new G() const link = group.link(url) expect(link.attr('href')).toBe(url) expect(link).toEqual(any(A)) }) }) }) describe('Element', () => { describe('linker()', () => { it('returns the instance of the link of a linked element', () => { const link = new A().to(url) const rect = link.rect(100, 100) expect(rect.linker()).toBe(link) }) it('returns null if no link is found', () => { const group = new G() const rect = group.rect(100, 100) expect(rect.linker()).toBe(null) }) it('returns null when el is not in dom at all', () => { const group = new G() expect(group.linker()).toBe(null) }) }) describe('unlink()', () => { it('returns itself', () => { const group = new G() expect(group.unlink()).toBe(group) }) it('removes the link', () => { const group = new G() const link = group.link(url) const rect = link.rect(100, 100) expect(rect.unlink().parent()).toBe(group) expect(link.parent()).toBe(null) }) it("removes also the link when link wasn't in document", () => { const link = new A().to(url) const rect = link.rect(100, 100) expect(rect.unlink().parent()).toBe(null) expect(link.parent()).toBe(null) }) }) describe('linkTo()', () => { it('wraps the called element in a link with given url', () => { const rect = new Rect() rect.linkTo(url) expect(rect.linker()).toEqual(any(A)) expect(rect.linker().attr('href')).toBe(url) }) it('wraps the called element in a link with given block', () => { const rect = new Rect() rect.linkTo(function (link) { link.to(url).target('_blank') }) expect(rect.linker().attr('href')).toBe(url) expect(rect.linker().attr('target')).toBe('_blank') }) it('reuses existing link if possible', () => { const rect = new Rect() rect.linkTo(url) const link = rect.linker() rect.linkTo(url + '/something') expect(rect.linker()).toBe(link) }) }) }) }) svg.js-3.2.4/spec/spec/elements/Circle.js000066400000000000000000000034321463723416200202030ustar00rootroot00000000000000/* globals describe, expect, it, beforeEach, spyOn, jasmine */ import { Circle, G } from '../../../src/main.js' const { any, objectContaining } = jasmine describe('Circle.js', () => { let circle beforeEach(() => { circle = new Circle() }) describe('()', () => { it('creates a new object of type Circle', () => { expect(new Circle()).toEqual(any(Circle)) }) it('sets passed attributes on the element', () => { expect(new Circle({ id: 'foo' }).id()).toBe('foo') }) }) describe('radius()', () => { it('calls attr with r', () => { const spy = spyOn(circle, 'attr').and.callThrough() circle.radius(123) expect(spy).toHaveBeenCalledWith('r', 123) }) }) describe('rx()', () => { it('calls attr with r', () => { const spy = spyOn(circle, 'attr') circle.rx(123) expect(spy).toHaveBeenCalledWith('r', 123) }) }) describe('ry()', () => { it('calls rx', () => { const spy = spyOn(circle, 'rx') circle.ry(123) expect(spy).toHaveBeenCalledWith(123) }) }) describe('size()', () => { it('calls radius with half of the size', () => { const spy = spyOn(circle, 'radius') circle.size(100) expect(spy).toHaveBeenCalledWith(objectContaining({ value: 50 })) }) }) describe('Container', () => { describe('circle()', () => { it('creates a circle with given size', () => { const group = new G() const circle = group.circle(50) expect(circle.attr('r')).toBe(25) expect(circle).toEqual(any(Circle)) }) it('defaults to zero size', () => { const group = new G() const circle = group.circle() expect(circle.attr('r')).toBe(0) expect(circle).toEqual(any(Circle)) }) }) }) }) svg.js-3.2.4/spec/spec/elements/ClipPath.js000066400000000000000000000056761463723416200205220ustar00rootroot00000000000000/* globals describe, expect, it, spyOn, jasmine, container */ import { ClipPath, SVG, Container, Rect } from '../../../src/main.js' const { any } = jasmine describe('ClipPath.js', () => { describe('()', () => { it('creates a new object of type ClipPath', () => { expect(new ClipPath()).toEqual(any(ClipPath)) }) it('sets passed attributes on the element', () => { expect(new ClipPath({ id: 'foo' }).id()).toBe('foo') }) }) describe('remove()', () => { it('unclips all targets', () => { const canvas = SVG().addTo(container) const clip = canvas.clip() const rect = canvas.rect(100, 100).clipWith(clip) expect(clip.remove()).toBe(clip) expect(rect.clipper()).toBe(null) }) it('calls remove on parent class', () => { const clip = new ClipPath() const spy = spyOn(Container.prototype, 'remove') clip.remove() expect(spy).toHaveBeenCalled() }) }) describe('targets()', () => { it('gets all targets of this clipPath', () => { const canvas = SVG().addTo(container) const clip = canvas.clip() const rect = canvas.rect(100, 100).clipWith(clip) expect(clip.targets()).toEqual([rect]) }) }) describe('Container', () => { describe('clip()', () => { it('creates a clipPath in the defs', () => { const canvas = SVG() const clip = canvas.clip() expect(clip).toEqual(any(ClipPath)) expect(canvas.defs().children()).toEqual([clip]) }) }) }) describe('Element', () => { describe('clipper()', () => { it('returns the instance of ClipPath the current element is clipped with', () => { const canvas = SVG().addTo(container) const clip = canvas.clip() const rect = canvas.rect(100, 100).clipWith(clip) expect(rect.clipper()).toEqual(clip) }) it('returns null if no clipPath was found', () => { expect(new Rect().clipper()).toBe(null) }) }) describe('clipWith()', () => { it('sets the clip-path attribute on the element to the id of the clipPath', () => { const clip = new ClipPath().id('foo') const rect = new Rect().clipWith(clip) expect(rect.attr('clip-path')).toBe('url(#foo)') }) it('creates a clipPath and appends the passed element to it to clip current element', () => { const canvas = SVG().addTo(container) const circle = canvas.circle(40) const rect = canvas.rect(100, 100).clipWith(circle) expect(circle.parent()).toEqual(any(ClipPath)) expect(rect.attr('clip-path')).toBe(`url(#${circle.parent().id()})`) }) }) describe('unclip()', () => { it('sets the clip-target attribute to null and returns itself', () => { const clip = new ClipPath().id('foo') const rect = new Rect().clipWith(clip) expect(rect.unclip()).toBe(rect) expect(rect.attr('clip-path')).toBe(undefined) }) }) }) }) svg.js-3.2.4/spec/spec/elements/Container.js000066400000000000000000000067761463723416200207420ustar00rootroot00000000000000/* globals describe, expect, it, beforeEach, jasmine, container */ import { Container, create, SVG } from '../../../src/main.js' const { any } = jasmine describe('Container.js', () => { describe('()', () => { it('creates a new object of type Container', () => { expect(new Container(create('g'))).toEqual(any(Container)) }) }) let canvas let rect1 let group1 let rect2 let circle1 let group2 let circle2 let group3 let line1 let line2 let circle3 let group4 let rect3 beforeEach(() => { canvas = SVG().addTo(container) rect1 = canvas.rect(100, 100).id('rect1') group1 = canvas.group().id('group1') rect2 = group1.rect(100, 100).id('rect2') circle1 = group1.circle(50).id('circle1') group2 = group1.group().id('group2') circle2 = group2.circle(50).id('circle2') group3 = group2.group().id('group3') line1 = group3.line(1, 1, 2, 2).id('line1') line2 = group3.line(1, 1, 2, 2).id('line2') circle3 = group2.circle(50).id('circle3') group4 = canvas.group().id('group4') rect3 = group4.rect(100, 100).id('rect3') /* should be: canvas rect1 group1 rect2 circle1 group2 circle2 group3 line1 line2 circle3 group4 rect3 */ }) describe('flatten()', () => { it('flattens the whole document when called on the root', () => { canvas.flatten() expect(canvas.children()).toEqual([ rect1, rect2, circle1, circle2, line1, line2, circle3, rect3 ]) }) it('flattens a group and places all children into its parent when called on a group - 1', () => { group1.flatten() /* now should be: canvas rect1 group1 rect2 circle1 circle2 line1 line2 circle3 group4 rect3 */ expect(canvas.children()).toEqual([rect1, group1, group4]) expect(group1.children()).toEqual([ rect2, circle1, circle2, line1, line2, circle3 ]) }) it('flattens a group and places all children into its parent when called on a group - 2', () => { group2.flatten() /* now should be: canvas rect1 group1 rect2 circle1 group2 circle2 line1 line2 circle3 group4 rect3 */ expect(group2.children()).toEqual([circle2, line1, line2, circle3]) }) }) describe('ungroup()', () => { it('ungroups a group and inserts all children in the correct order in the parent parent of the group', () => { group1.ungroup() expect(canvas.children()).toEqual([rect1, rect2, circle1, group2, group4]) group4.ungroup() expect(canvas.children()).toEqual([rect1, rect2, circle1, group2, rect3]) }) it('ungroups a group into another group and appends the elements to the other group', () => { group1.ungroup(group4) expect(group4.children()).toEqual([rect3, rect2, circle1, group2]) }) it('ungroups a group into another group at the specified position', () => { group2.ungroup(group1, 1) expect(group1.children()).toEqual([ rect2, circle2, group3, circle3, circle1 ]) }) }) }) svg.js-3.2.4/spec/spec/elements/Defs.js000066400000000000000000000013661463723416200176670ustar00rootroot00000000000000/* globals describe, expect, it, jasmine */ import { Defs } from '../../../src/main.js' const { any } = jasmine describe('Defs.js', () => { describe('()', () => { it('creates a new object of type Defs', () => { expect(new Defs()).toEqual(any(Defs)) }) it('sets passed attributes on the element', () => { expect(new Defs({ id: 'foo' }).id()).toBe('foo') }) }) describe('flatten()', () => { it('does nothing and returns itself', () => { const defs = Object.freeze(new Defs()) expect(defs.flatten()).toBe(defs) }) }) describe('ungroup()', () => { it('does nothing and returns itself', () => { const defs = Object.freeze(new Defs()) expect(defs.ungroup()).toBe(defs) }) }) }) svg.js-3.2.4/spec/spec/elements/Dom.js000066400000000000000000000541741463723416200175320ustar00rootroot00000000000000/* globals describe, expect, it, beforeEach, spyOn, jasmine, container */ import { SVG, G, Rect, Svg, Dom, List, Fragment, Circle, Tspan, create } from '../../../src/main.js' import { getWindow } from '../../../src/utils/window.js' import { svg, html } from '../../../src/modules/core/namespaces.js' const { any, createSpy, objectContaining } = jasmine describe('Dom.js', function () { describe('()', () => { it('creates a new object of type Dom', () => { const rect = new Rect() expect(new Dom(rect.node)).toEqual(any(Dom)) }) it('sets passed attributes on the element', () => { const rect = new Rect() expect(new Dom(rect.node, { id: 'foo' }).id()).toBe('foo') }) it('references the passed node on the instance', () => { const rect = new Rect() expect(new Dom(rect.node).node).toBe(rect.node) }) it('sets the type according to the nodename', () => { const rect = new Rect() expect(new Dom(rect.node).type).toBe(rect.node.nodeName) }) }) describe('add()', () => { it('adds an element as child to the end with no second argument given', () => { const g = new G() g.add(new Rect()) const rect = new Rect() g.add(rect) expect(g.children().length).toBe(2) expect(g.get(1)).toBe(rect) }) it('adds an element at the specified position with second argument given', () => { const g = new G() g.add(new Rect()) g.add(new Rect()) const rect = new Rect() g.add(rect, 1) expect(g.children().length).toBe(3) expect(g.get(1)).toBe(rect) }) it('does nothing if element is already the element at that position', () => { const g = new G() g.rect(100, 100) const rect = g.rect(100, 100) g.add(rect, 1) expect(g.get(1)).toBe(rect) }) it('handles svg strings', () => { const g = new G() g.add('') expect(g.children().length).toBe(1) expect(g.get(0)).toEqual(any(Rect)) }) it('handles query selectors', () => { const canvas = SVG().addTo(container) const rect = canvas.rect(100, 100).addClass('test') const g = canvas.group() g.add('.test') expect(g.children().length).toBe(1) expect(g.get(0)).toBe(rect) }) it('handles a node', () => { const g = new G() const node = create('rect') g.add(node) expect(g.children().length).toBe(1) expect(g.get(0)).toEqual(any(Rect)) }) }) describe('addTo()', () => { it('returns the current element', () => { const g = new G() const rect = new Rect() expect(rect.addTo(g)).toBe(rect) }) it('puts an element into another element', () => { const g = new G() const rect = new Rect() const spy = spyOn(g, 'put') rect.addTo(g, 0) expect(spy).toHaveBeenCalledWith(rect, 0) }) it('works with svg strings', () => { const rect = new Rect() rect.addTo('') expect(rect.parent()).toEqual(any(G)) }) it('works with query selector', () => { const canvas = SVG().addTo(container) const rect = canvas.rect(100, 100) const g = canvas.group().addClass('test') rect.addTo('.test') expect(g.children().length).toBe(1) expect(g.get(0)).toBe(rect) }) }) describe('children()', () => { it('returns a List of all children', () => { const g = new G() const rect = g.rect(100, 100) const circle = g.circle(100, 100) const children = g.children() expect(children).toEqual([rect, circle]) expect(children).toEqual(any(List)) }) }) describe('clear()', () => { it('returns the current element', () => { const g = new G() g.rect(100, 100) g.circle(100, 100) expect(g.clear()).toBe(g) }) it('removes all children from an element', () => { const g = new G() g.rect(100, 100) g.circle(100, 100) g.clear() expect(g.children()).toEqual([]) }) }) describe('clone()', () => { it('clones the current element and returns it', () => { const rect = new Rect() const clone = rect.clone() expect(rect).not.toBe(clone) expect(clone).toEqual(any(Rect)) expect(clone.type).toBe(rect.type) }) it('also clones the children by default', () => { const group = new G() const rect = group.rect(100, 100) const clone = group.clone() expect(clone.get(0)).not.toBe(rect) expect(clone.get(0)).toEqual(any(Rect)) }) it('does not clone the children when passing false', () => { const group = new G() group.rect(100, 100) const clone = group.clone(false) expect(clone.children()).toEqual([]) }) it('assigns a new id to the element and to child elements by default', () => { const group = new G().id('group') const rect = group.rect(100, 100).id('rect') const clone = group.clone() expect(clone.get(0).id()).not.toBe(rect.id()) expect(clone.id()).not.toBe(group.id()) }) it('does not assign a new id to the element and to child elements', () => { const group = new G().id('group') const rect = group.rect(100, 100).id('rect') const clone = group.clone(true, false) expect(clone.get(0).id()).toBe(rect.id()) expect(clone.id()).toBe(group.id()) }) it('returns an instance of the same class the method was called on', () => { const rect = new Dom(create('rect')) expect(rect.constructor).toBe(Dom) expect(rect.clone().constructor).toBe(Dom) }) }) describe('each()', () => { it('iterates over all children and executes the passed function on then', () => { const group = new G() const group2 = group.group() const circle = group.circle(100, 100) const spy = createSpy('each') group.each(spy) expect(spy.calls.all()).toEqual([ objectContaining({ object: group2, args: [0, [group2, circle]] }), objectContaining({ object: circle, args: [1, [group2, circle]] }) ]) }) it('iterates over all children recursively and executes the passed function on then when deep is true', () => { const group = new G() const group2 = group.group() const rect = group2.rect(100, 100) const circle = group.circle(100, 100) const spy = createSpy('each') group.each(spy, true) expect(spy.calls.all()).toEqual([ objectContaining({ object: group2, args: [0, [group2, circle]] }), objectContaining({ object: rect, args: [0, [rect]] }), objectContaining({ object: circle, args: [1, [group2, circle]] }) ]) }) }) describe('element()', () => { it('creates an element of given type and appends it to the current element', () => { const g = new G() const el = g.element('title') expect(el).toEqual(any(Dom)) expect(el.type).toBe('title') }) it('sets the specified attributes passed as second argument', () => { const g = new G() const el = g.element('title', { id: 'foo' }) expect(el.id()).toBe('foo') }) }) describe('first()', () => { it('returns the first child', () => { const g = new G() const rect = g.rect(100, 100) g.circle(100, 100) expect(g.first()).toBe(rect) }) it('returns null if no first child exists', () => { expect(new G().first()).toBe(null) }) }) describe('get()', () => { it('returns the child at the given position', () => { const g = new G() const rect = g.rect(100, 100) const circle = g.circle(100, 100) expect(g.get(0)).toBe(rect) expect(g.get(1)).toBe(circle) }) }) describe('getEventHolder()', () => { it('returns the node because it holds all events on the object', () => { const dom = new Dom({}) expect(dom.getEventHolder()).toBe(dom.node) }) }) describe('getEventTarget()', () => { it('returns the node because it is the target of the event', () => { const dom = new Dom({}) expect(dom.getEventTarget()).toBe(dom.node) }) }) describe('has()', () => { it('returns true if the element has the passed element as child', () => { const g = new G() const rect = g.rect(100, 100) expect(g.has(rect)).toBe(true) }) it("returns false if the element hasn't the passed element as child", () => { const g = new G() const rect = new Rect() expect(g.has(rect)).toBe(false) }) }) describe('html()', () => { it('calls xml with the html namespace', () => { const group = new G() const spy = spyOn(group, 'xml') group.html('') expect(spy).toHaveBeenCalledWith('', undefined, html) }) }) describe('id()', () => { it('returns current element when called as setter', () => { const g = new G() expect(g.id('asd')).toBe(g) }) it('sets the id with argument given', () => { expect(new G().id('foo').node.id).toBe('foo') }) it('gets the id when no argument given', () => { const g = new G({ id: 'foo' }) expect(g.id()).toBe('foo') }) it('generates an id on getting if none is set', () => { const g = new G() expect(g.node.id).toBe('') g.id() expect(g.node.id).not.toBe('') }) }) describe('index()', () => { it('gets the position of the passed child', () => { const g = new G() g.rect(100, 100) const rect = g.rect(100, 100) expect(g.index(rect)).toBe(1) }) it('returns -1 if element is no child', () => { const g = new G() const rect = new Rect() expect(g.index(rect)).toBe(-1) }) }) describe('last()', () => { it('gets the last child of the element', () => { const g = new G() g.rect(100, 100) const rect = g.rect(100, 100) expect(g.last()).toBe(rect) }) it('returns null if no last child exists', () => { expect(new G().last()).toBe(null) }) }) describe('parent()', () => { var canvas, rect, group1, group2 beforeEach(function () { canvas = SVG().addTo(container) group1 = canvas.group().addClass('test') group2 = group1.group() rect = group2.rect(100, 100) }) it('returns the svg parent with no argument given', () => { expect(rect.parent()).toBe(group2) }) it('returns the closest parent with the correct type', () => { expect(rect.parent(Svg)).toBe(canvas) }) it('returns the closest parent matching the selector', () => { expect(rect.parent('.test')).toBe(group1) }) it('returns null if it cannot find a parent matching the argument', () => { expect(rect.parent('.not-there')).toBe(null) }) it('returns null if it cannot find a parent matching the argument in a #document-fragment', () => { const fragment = getWindow().document.createDocumentFragment() const svg = new Svg().addTo(fragment) const rect = svg.rect(100, 100) expect(rect.parent('.not-there')).toBe(null) }) it('returns Dom if parent is #document-fragment', () => { const fragment = getWindow().document.createDocumentFragment() const svg = new Svg().addTo(fragment) expect(svg.parent()).toEqual(any(Dom)) }) it('returns html parents, too', () => { expect(canvas.parent().node).toBe(container) }) }) describe('put()', () => { it('calls add() but returns the added element instead', () => { const g = new G() const rect = new Rect() const spy = spyOn(g, 'add').and.callThrough() expect(g.put(rect, 0)).toBe(rect) expect(spy).toHaveBeenCalledWith(rect, 0) }) it('creates object from svg string', () => { const g = new G() const rect = '' const spy = spyOn(g, 'add').and.callThrough() const ret = g.put(rect, 0) expect(ret).toEqual(any(Rect)) expect(spy).toHaveBeenCalledWith(ret, 0) }) it('works with a query selector', () => { const canvas = SVG().addTo(container) const rect = canvas.rect().addClass('test') const g = canvas.group() const spy = spyOn(g, 'add').and.callThrough() const ret = g.put('.test', 0) expect(ret).toEqual(rect) expect(spy).toHaveBeenCalledWith(rect, 0) }) }) describe('putIn()', () => { it('calls add on the given parent', () => { const g = new G() const rect = new Rect() const spy = spyOn(g, 'add') rect.putIn(g, 0) expect(spy).toHaveBeenCalledWith(rect, 0) }) it('returns the passed element', () => { const g = new G() const rect = new Rect() expect(rect.putIn(g, 0)).toBe(g) }) it('returns an instance when svg string given', () => { const g = '' const rect = new Rect() const ret = rect.putIn(g) expect(ret).toEqual(any(G)) expect(ret.children()).toEqual([rect]) }) it('works with a query selector', () => { const canvas = SVG().addTo(container) const g = canvas.group().addClass('test') const rect = canvas.rect(100, 100) const ret = rect.putIn('.test') expect(ret).toBe(g) expect(g.children()).toEqual([rect]) }) }) describe('remove()', () => { it('returns the removed element', () => { const canvas = SVG().addTo(container) const rect = canvas.rect(100, 100) expect(rect.remove()).toBe(rect) }) it('removes the element from the parent', () => { const canvas = SVG().addTo(container) const rect = canvas.rect(100, 100) expect(canvas.children()).toEqual([rect]) rect.remove() expect(canvas.children()).toEqual([]) }) it('is a noop when element is not attached to the dom', () => { const rect = new Rect() expect(rect.remove()).toBe(rect) }) it('also works when direct child of document-fragment', () => { const fragment = new Fragment() const rect = fragment.rect(100, 100) expect(fragment.children()).toEqual([rect]) expect(rect.remove()).toBe(rect) expect(fragment.children()).toEqual([]) }) }) describe('removeElement()', () => { it('returns itself', () => { const g = new G() const rect = g.rect(100, 100) expect(g.removeElement(rect)).toBe(g) }) it('removes the given child', () => { const g = new G() const rect = g.rect(100, 100) expect(g.removeElement(rect).children()).toEqual([]) }) it('throws if the given element is not a child', () => { const g = new G() const rect = new Rect() try { g.removeElement(rect) } catch (e) { expect(e).toEqual(objectContaining({ code: 8 })) } }) }) describe('replace()', () => { it('returns the new element', () => { const g = new G() const rect = g.rect(100, 100) const circle = new Circle() expect(rect.replace(circle)).toBe(circle) }) it('replaces the child at the correct position', () => { const g = new G() const rect1 = g.rect(100, 100) const rect2 = g.rect(100, 100) const rect3 = g.rect(100, 100) const circle = new Circle() rect2.replace(circle) expect(g.children()).toEqual([rect1, circle, rect3]) }) it('also works without a parent', () => { const rect = new Rect() const circle = new Circle() expect(rect.replace(circle)).toBe(circle) }) }) describe('round()', () => { it('rounds all attributes whose values are numbers to two decimals by default', () => { const rect = new Rect({ id: 'foo', x: 10.678, y: 3, width: 123.456 }) expect(rect.round().attr()).toEqual({ id: 'foo', x: 10.68, y: 3, width: 123.46 }) }) it('rounds all attributes whose values are numbers to the passed precision', () => { const rect = new Rect({ id: 'foo', x: 10.678, y: 3, width: 123.456 }) expect(rect.round(1).attr()).toEqual({ id: 'foo', x: 10.7, y: 3, width: 123.5 }) }) it('rounds the given attributes whose values are numbers to the passed precision', () => { const rect = new Rect({ id: 'foo', x: 10.678, y: 3, width: 123.456 }) expect(rect.round(1, ['id', 'x']).attr()).toEqual({ id: 'foo', x: 10.7, y: 3, width: 123.456 }) }) }) describe('svg()', () => { it('calls xml with the svg namespace', () => { const group = new G() const spy = spyOn(group, 'xml') group.svg('') expect(spy).toHaveBeenCalledWith('', undefined, svg) }) }) describe('toString()', () => { it('calls id() and returns its result', () => { const rect = new Rect({ id: 'foo' }) const spy = spyOn(rect, 'id').and.callThrough() expect(rect.toString()).toBe('foo') expect(spy).toHaveBeenCalled() }) }) describe('words', () => { it('sets the nodes textContent to the given value', () => { const tspan = new Tspan().words('Hello World') expect(tspan.text()).toBe('Hello World') }) }) describe('wrap()', function () { var canvas var rect beforeEach(function () { canvas = SVG() rect = canvas.rect(100, 100) }) it('returns the current element', function () { expect(rect.wrap(new G())).toBe(rect) }) it('wraps the passed element around the current element', function () { var g = new G() expect(rect.wrap(g).parent()).toBe(g) expect(g.parent()).toBe(canvas) }) it('wraps also when element is not in the dom', () => { var g = new G() var rect = new Rect() expect(rect.wrap(g).parent()).toBe(g) expect(g.parent()).toBe(null) }) it('inserts at the correct position', () => { canvas.rect(100, 100) rect = canvas.rect(100, 100) var position = rect.position() var g = new G() expect(rect.wrap(g).parent().position()).toBe(position) }) it('allows to pass an svg string as element', () => { rect.wrap('') expect(rect.parent()).toEqual(any(G)) expect(rect.parent().parent()).toBe(canvas) }) it('allows to pass an svg string as element', () => { rect.wrap('') expect(rect.parent()).toEqual(any(G)) expect(rect.parent().parent()).toBe(canvas) }) it('allows to pass an svg string as element when element not in the dom', () => { var rect = new Rect() rect.wrap(SVG('')) expect(rect.parent()).toEqual(any(G)) expect(rect.parent().parent()).toBe(null) }) it('allows to pass an svg node as element', () => { const node = create('g') rect.wrap(node) expect(rect.parent()).toEqual(any(G)) expect(rect.parent().node).toBe(node) expect(rect.parent().parent()).toBe(canvas) }) }) describe('xml()', () => { describe('as setter', () => { it('returns itself', () => { const g = new G() expect(g.xml('', undefined, svg)).toBe(g) }) it('imports a single element', () => { const g = new G().xml('', undefined, svg) expect(g.children()).toEqual([any(Rect)]) expect(g.children()[0].node.namespaceURI).toBe(svg) }) it('imports multiple elements', () => { const g = new G().xml('', undefined, svg) expect(g.children()).toEqual([any(Rect), any(Circle)]) }) it('replaces the current element with the imported elements with outerHtml = true', () => { const canvas = new Svg() const g = canvas.group() g.xml('', true, svg) expect(canvas.children()).toEqual([any(Rect), any(Circle)]) }) it('returns the parent when outerHtml = true', () => { const canvas = new Svg() const g = canvas.group() expect(g.xml('', true, svg)).toBe(canvas) expect(canvas.children()).toEqual([any(Rect), any(Circle)]) }) it('works without a parent', () => { const canvas = new Svg() expect(canvas.xml('', undefined, svg)).toBe(canvas) }) }) describe('as getter', () => { let canvas, group, rect beforeEach(() => { canvas = new Svg().removeNamespace() group = canvas.group() rect = group.rect(123.456, 234.567) }) it('returns the svg string of the element by default', () => { expect(rect.xml(), svg).toBe( '' ) expect(canvas.xml(), svg).toBe( '' ) }) it('returns the innerHtml when outerHtml = false', () => { expect(rect.xml(false, svg)).toBe('') expect(canvas.xml(false, svg)).toBe( '' ) }) it('runs a function on every exported node', () => { expect(rect.xml((el) => el.round(1))).toBe( '' ) }) it('runs a function on every exported node and replaces node with returned node if return value is not falsy', () => { expect(rect.xml(() => new Circle(), svg)).toBe('') expect(canvas.xml(() => new G(), svg)).toBe('') // outer was replaced by an empty g expect( canvas.xml((el) => { if (el instanceof Rect) return new Circle() if (el instanceof Svg) el.removeNamespace() }, svg) ).toBe('') }) it('runs a function on every exported node and removes node if return value is false', () => { expect(group.xml(() => false, svg)).toBe('') expect(canvas.xml(() => false, svg)).toBe('') expect( canvas.xml((el) => { if (el instanceof Svg) { el.removeNamespace() } else { return false } }, svg) ).toBe('') }) it('runs a function on every inner node and exports it when outerHtml = false', () => { expect(canvas.xml(() => false, false, svg)).toBe('') expect(canvas.xml(() => undefined, false, svg)).toBe( '' ) }) }) }) }) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������svg.js-3.2.4/spec/spec/elements/Element.js����������������������������������������������������������0000664�0000000�0000000�00000024756�14637234162�0020407�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* globals describe, expect, it, beforeEach, spyOn, jasmine, container */ import { Element, create, Rect, G, SVG, Text } from '../../../src/main.js' const { any, objectContaining } = jasmine describe('Element.js', function () { let element beforeEach(() => { element = new Element(create('rect')) }) describe('()', () => { it('creates a new object of type Element', () => { expect(element).toEqual(any(Element)) }) it('sets passed attributes on the element', () => { expect(new Element(create('rect'), { id: 'foo' }).id()).toBe('foo') }) it('references the instance on the passed node', () => { expect(element.node.instance).toBe(element) }) it('sets the dom property to an empty object', () => { expect(element.dom).toEqual({}) }) it('hydrates the dom property with data found in the dom', () => { element.dom = { foo: 'bar' } element.writeDataToDom() expect(new Element(element.node).dom).toEqual({ foo: 'bar' }) }) it('falls back to empty object when attribute is null', () => { element.node.setAttribute('data-svg', 'null') expect(new Element(element.node).dom).toEqual({}) }) it('uses old svgjs:data attribute if present', () => { element.node.setAttribute('svgjs:data', '{"foo":"bar"}') expect(new Element(element.node).dom).toEqual({ foo: 'bar' }) }) }) describe('center()', () => { it('calls cx and cy with passed parameters and returns itself', () => { const spyCx = spyOn(element, 'cx').and.callThrough() const spyCy = spyOn(element, 'cy').and.callThrough() expect(element.center(1, 2)).toBe(element) expect(spyCx).toHaveBeenCalledWith(1) expect(spyCy).toHaveBeenCalledWith(2) }) }) describe('cx()', () => { it('gets the elements center along the x axis', () => { element.attr({ x: 10, width: 100 }) expect(element.cx()).toBe(60) }) it('centers the element along the x axis and returns itself', () => { element.attr({ x: 10, width: 100 }) expect(element.cx(100)).toBe(element) expect(element.attr('x')).toBe(50) }) }) describe('cy()', () => { it('gets the elements center along the y axis', () => { element.attr({ y: 10, height: 100 }) expect(element.cy()).toBe(60) }) it('centers the element along the y axis and returns itself', () => { element.attr({ y: 10, height: 100 }) expect(element.cy(100)).toBe(element) expect(element.attr('y')).toBe(50) }) }) describe('defs()', () => { it('returns null if detached', () => { expect(new Rect().defs()).toBe(null) expect(new G().put(new Rect()).defs()).toBe(null) }) it('calls defs on root node', () => { const canvas = SVG() const rect = canvas.rect(100, 100) const spy = spyOn(canvas, 'defs').and.callThrough() expect(rect.defs()).toBe(canvas.defs()) expect(spy.calls.count()).toBe(2) }) }) describe('dmove()', () => { it('calls dx and dy with passed parameters and returns itself', () => { const spyDx = spyOn(element, 'dx').and.callThrough() const spyDy = spyOn(element, 'dy').and.callThrough() expect(element.dmove(1, 2)).toBe(element) expect(spyDx).toHaveBeenCalledWith(1) expect(spyDy).toHaveBeenCalledWith(2) }) }) describe('dx()', () => { it('moves by zero by default', () => { element.attr({ x: 10, width: 100 }) expect(element.dx().x()).toBe(10) }) it('moves the element along the x axis relatively and returns itself', () => { element.attr({ x: 10, width: 100 }) expect(element.dx(100)).toBe(element) expect(element.attr('x')).toBe(110) }) }) describe('dy()', () => { it('moves by zero by default', () => { element.attr({ y: 10, height: 100 }) expect(element.dy().y()).toBe(10) }) it('moves the element along the x axis relatively and returns itself', () => { element.attr({ y: 10, height: 100 }) expect(element.dy(100)).toBe(element) expect(element.attr('y')).toBe(110) }) }) describe('root()', () => { it('returns the root of this element', () => { const canvas = SVG() const rect = canvas.rect() expect(rect.root()).toBe(canvas) }) it('returns null if element is detached', () => { expect(new G().put(new Rect()).root()).toBe(null) }) }) describe('getEventHolder()', () => { it('returns itself', () => { expect(element.getEventHolder()).toBe(element) }) }) describe('height()', () => { it('calls attr with height', () => { const spy = spyOn(element, 'attr') element.height(123) expect(spy).toHaveBeenCalledWith('height', 123) }) }) describe('move()', () => { it('calls x and y with passed parameters and returns itself', () => { const spyx = spyOn(element, 'x').and.callThrough() const spyy = spyOn(element, 'y').and.callThrough() expect(element.move(1, 2)).toBe(element) expect(spyx).toHaveBeenCalledWith(1) expect(spyy).toHaveBeenCalledWith(2) }) }) describe('parents()', () => { it('returns array of parents until the passed element or root svg', () => { const canvas = SVG().addTo(container) const _groupA = canvas.group().addClass('test') const group1 = canvas.group().addClass('test') const group2 = group1.group() const group3 = group2.group() const rect = group3.rect(100, 100) expect(rect.parents('.test')).toEqual([group3, group2, group1]) expect(rect.parents(group2)).toEqual([group3, group2]) expect(rect.parents(group1).length).toBe(3) expect(rect.parents()).toEqual([group3, group2, group1, canvas]) }) it('returns array of parents until the closest matching parent', () => { const canvas = SVG().addTo(container) const _groupA = canvas.group().addClass('test') const group1 = canvas.group().addClass('test') const group2 = group1.group().addClass('test').addClass('foo') const group3 = group2.group().addClass('foo') const rect = group3.rect(100, 100) expect(rect.parents('.test')).toEqual([group3, group2]) expect(rect.parents('.foo')).toEqual([group3]) expect(rect.parents('.test:not(.foo)')).toEqual([group3, group2, group1]) }) it('returns null if the passed element is not an ancestor', () => { const canvas = SVG().addTo(container) const groupA = canvas.group().addClass('test') const group1 = canvas.group() const group2 = group1.group() const group3 = group2.group() const rect = group3.rect(100, 100) expect(rect.parents('.does-not-exist')).toEqual(null) expect(rect.parents('.test')).toEqual(null) expect(rect.parents(groupA)).toEqual(null) }) }) describe('reference()', () => { it('gets a referenced element from a given attribute', () => { const canvas = SVG().addTo(container) const rect = canvas.defs().rect(100, 100) const use = canvas.use(rect) const mark = canvas.marker(10, 10) const path = canvas.path('M0 0 50 50').marker('end', mark) expect(use.reference('href')).toBe(rect) expect(path.reference('marker-end')).toBe(mark) expect(rect.reference('width')).toBe(null) }) }) describe('setData()', () => { it('sets the given data to the dom property and returns itself', () => { expect(element.setData({ foo: 'bar' })).toBe(element) expect(element.dom).toEqual({ foo: 'bar' }) }) }) describe('size()', () => { it('calls width and height with passed parameters and returns itself', () => { const spyWidth = spyOn(element, 'width').and.callThrough() const spyHeight = spyOn(element, 'height').and.callThrough() expect(element.size(1, 2)).toBe(element) expect(spyWidth).toHaveBeenCalledWith(objectContaining({ value: 1 })) expect(spyHeight).toHaveBeenCalledWith(objectContaining({ value: 2 })) }) it('changes height proportionally if null', () => { const canvas = SVG().addTo(container) const element = canvas.rect(100, 100) const spyWidth = spyOn(element, 'width').and.callThrough() const spyHeight = spyOn(element, 'height').and.callThrough() expect(element.size(200, null)).toBe(element) expect(spyWidth).toHaveBeenCalledWith(objectContaining({ value: 200 })) expect(spyHeight).toHaveBeenCalledWith(objectContaining({ value: 200 })) }) it('changes width proportionally if null', () => { const canvas = SVG().addTo(container) const element = canvas.rect(100, 100) const spyWidth = spyOn(element, 'width').and.callThrough() const spyHeight = spyOn(element, 'height').and.callThrough() expect(element.size(null, 200)).toBe(element) expect(spyWidth).toHaveBeenCalledWith(objectContaining({ value: 200 })) expect(spyHeight).toHaveBeenCalledWith(objectContaining({ value: 200 })) }) }) describe('width()', () => { it('calls attr with width', () => { const spy = spyOn(element, 'attr') element.width(123) expect(spy).toHaveBeenCalledWith('width', 123) }) }) describe('writeDataToDom()', () => { it('removes previously set data', () => { element.node.setAttribute('data-svgjs', JSON.stringify({ foo: 'bar' })) element.writeDataToDom() expect(element.node.getAttribute('data-svgjs')).toBe(null) }) it('writes data from the dom property into the dom', () => { element.dom = { foo: 'bar' } element.writeDataToDom() expect(element.node.getAttribute('data-svgjs')).toBe( JSON.stringify({ foo: 'bar' }) ) }) it('recursively calls writeDataToDom on all children', () => { const g = new G() const rect = g.rect(100, 100) const spy = spyOn(rect, 'writeDataToDom') g.writeDataToDom() expect(spy).toHaveBeenCalled() }) it('filters out default data', () => { const node1 = new Text() const node2 = new Text() node2.dom.foo = 'bar' node1.writeDataToDom() node2.writeDataToDom() expect(node1.node.getAttribute('data-svgjs')).toBe(null) expect(node2.node.getAttribute('data-svgjs')).toBe('{"foo":"bar"}') }) }) describe('x()', () => { it('calls attr with x', () => { const spy = spyOn(element, 'attr') element.x(123) expect(spy).toHaveBeenCalledWith('x', 123) }) }) describe('y()', () => { it('calls attr with y', () => { const spy = spyOn(element, 'attr') element.y(123) expect(spy).toHaveBeenCalledWith('y', 123) }) }) }) ������������������svg.js-3.2.4/spec/spec/elements/Ellipse.js����������������������������������������������������������0000664�0000000�0000000�00000005322�14637234162�0020377�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* globals describe, expect, it, spyOn, jasmine, container */ import { Ellipse, SVG, G } from '../../../src/main.js' const { any, objectContaining } = jasmine describe('Ellipse.js', () => { describe('()', () => { it('creates a new object of type Ellipse', () => { expect(new Ellipse()).toEqual(any(Ellipse)) }) it('sets passed attributes on the element', () => { expect(new Ellipse({ id: 'foo' }).id()).toBe('foo') }) }) describe('size()', () => { it('calls rx and ry with passed parameters and returns itself', () => { const ellipse = new Ellipse() const spyrx = spyOn(ellipse, 'rx').and.callThrough() const spyry = spyOn(ellipse, 'ry').and.callThrough() expect(ellipse.size(4, 2)).toBe(ellipse) expect(spyrx).toHaveBeenCalledWith(objectContaining({ value: 2 })) expect(spyry).toHaveBeenCalledWith(objectContaining({ value: 1 })) }) it('changes ry proportionally if null', () => { const canvas = SVG().addTo(container) const ellipse = canvas.ellipse(100, 100) const spyrx = spyOn(ellipse, 'rx').and.callThrough() const spyry = spyOn(ellipse, 'ry').and.callThrough() expect(ellipse.size(200, null)).toBe(ellipse) expect(spyrx).toHaveBeenCalledWith(objectContaining({ value: 100 })) expect(spyry).toHaveBeenCalledWith(objectContaining({ value: 100 })) }) it('changes rx proportionally if null', () => { const canvas = SVG().addTo(container) const ellipse = canvas.ellipse(100, 100) const spyrx = spyOn(ellipse, 'rx').and.callThrough() const spyry = spyOn(ellipse, 'ry').and.callThrough() expect(ellipse.size(null, 200)).toBe(ellipse) expect(spyrx).toHaveBeenCalledWith(objectContaining({ value: 100 })) expect(spyry).toHaveBeenCalledWith(objectContaining({ value: 100 })) }) }) describe('Container', () => { describe('ellipse()', () => { it('creates a ellipse with given size', () => { const group = new G() const ellipse = group.ellipse(50, 50) expect(ellipse.attr('rx')).toBe(25) expect(ellipse.attr('ry')).toBe(25) expect(ellipse).toEqual(any(Ellipse)) }) it('defaults to same radius with one argument', () => { const group = new G() const ellipse = group.ellipse(50) expect(ellipse.attr('rx')).toBe(25) expect(ellipse.attr('ry')).toBe(25) expect(ellipse).toEqual(any(Ellipse)) }) it('defaults to zero radius with no argument', () => { const group = new G() const ellipse = group.ellipse() expect(ellipse.attr('rx')).toBe(0) expect(ellipse.attr('ry')).toBe(0) expect(ellipse).toEqual(any(Ellipse)) }) }) }) }) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������svg.js-3.2.4/spec/spec/elements/ForeignObject.js����������������������������������������������������0000664�0000000�0000000�00000003072�14637234162�0021522�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* globals describe, expect, it, jasmine */ import { makeInstance, ForeignObject } from '../../../src/main.js' const { any } = jasmine describe('ForeignObject.js', () => { describe('()', () => { it('creates a new object of type ForeignObject', () => { expect(new ForeignObject()).toEqual(any(ForeignObject)) }) it('sets passed attributes on the element', () => { expect(new ForeignObject({ id: 'foo' }).id()).toBe('foo') }) }) describe('Container', () => { describe('foreignObject()', () => { it('creates a foreignObject in the container', () => { const canvas = makeInstance().addTo('#canvas') const foreignObject = canvas.foreignObject() expect(foreignObject).toEqual(any(ForeignObject)) expect(foreignObject.parent()).toBe(canvas) }) it('sets width and height correctly on construction', () => { const canvas = makeInstance().addTo('#canvas') const foreignObject = canvas.foreignObject(100, 200) expect(foreignObject.width()).toBe(100) expect(foreignObject.height()).toBe(200) }) }) }) describe('Element methods', () => { it('is usable with Elements methods such as height() and width()', () => { const canvas = makeInstance().addTo('#canvas') const foreignObject = canvas.foreignObject() foreignObject.width(100).height(200).x(10).y(20) expect(foreignObject.width()).toBe(100) expect(foreignObject.height()).toBe(200) expect(foreignObject.x()).toBe(10) expect(foreignObject.y()).toBe(20) }) }) }) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������svg.js-3.2.4/spec/spec/elements/Fragment.js���������������������������������������������������������0000664�0000000�0000000�00000003773�14637234162�0020555�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* globals describe, expect, it, spyOn, jasmine */ import { Fragment, Dom } from '../../../src/main.js' import { getWindow } from '../../../src/utils/window.js' import { svg } from '../../../src/modules/core/namespaces.js' const { any } = jasmine describe('Fragment.js', () => { describe('()', () => { it('creates a new object of type Fragment', () => { expect(new Fragment()).toEqual(any(Fragment)) }) it('uses passed node instead of creating', () => { const fragment = getWindow().document.createDocumentFragment() expect(new Fragment(fragment).node).toBe(fragment) }) it('has all Container methods available', () => { const frag = new Fragment() const rect = frag.rect(100, 100) expect(frag.children()).toEqual([rect]) }) }) describe('xml()', () => { describe('as setter', () => { it('calls parent method with outerHtml = false', () => { const frag = new Fragment() const spy = spyOn(Dom.prototype, 'xml').and.callThrough() frag.xml('', true, svg) expect(spy).toHaveBeenCalledWith('', false, svg) }) }) describe('as getter', () => { it('calls parent method with outerHtml = false - 1', () => { const frag = new Fragment() const group = frag.group() group.rect(123.456, 234.567) const spy = spyOn(Dom.prototype, 'xml').and.callThrough() expect(frag.xml(false, svg)).toBe( '' ) expect(spy).toHaveBeenCalledWith(false, svg) }) it('calls parent method with outerHtml = false - 2', () => { const frag = new Fragment() const group = frag.group() group.rect(123.456, 234.567) const spy = spyOn(Dom.prototype, 'xml').and.callThrough() expect(frag.xml(true, svg)).toBe( '' ) expect(spy).toHaveBeenCalledWith(false, svg) }) }) }) }) �����svg.js-3.2.4/spec/spec/elements/G.js����������������������������������������������������������������0000664�0000000�0000000�00000001260�14637234162�0017165�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* globals describe, expect, it, jasmine, container */ import { G, SVG } from '../../../src/main.js' const { any } = jasmine describe('G.js', () => { describe('()', () => { it('creates a new object of type G', () => { expect(new G()).toEqual(any(G)) }) it('sets passed attributes on the element', () => { expect(new G({ id: 'foo' }).id()).toBe('foo') }) }) describe('Container', () => { describe('group()', () => { it('creates a group in the container', () => { const canvas = SVG().addTo(container) const g = canvas.group() expect(g).toEqual(any(G)) expect(g.parent()).toBe(canvas) }) }) }) }) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������svg.js-3.2.4/spec/spec/elements/Gradient.js���������������������������������������������������������0000664�0000000�0000000�00000006444�14637234162�0020545�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* globals describe, expect, it, spyOn, jasmine, container */ import { Gradient, SVG, Container } from '../../../src/main.js' const { any, objectContaining, createSpy } = jasmine describe('Gradient.js', () => { describe('()', () => { it('creates a new object of type LinearGradient', () => { const gradient = new Gradient('linear') expect(gradient).toEqual(any(Gradient)) expect(gradient.type).toBe('linearGradient') }) it('creates a new object of type RadialGradient', () => { const gradient = new Gradient('radial') expect(gradient).toEqual(any(Gradient)) expect(gradient.type).toBe('radialGradient') }) it('sets passed attributes on the element', () => { expect(new Gradient('linear', { id: 'foo' }).id()).toBe('foo') }) }) describe('attr()', () => { it('relays to parents attr method for any call except transformation', () => { const gradient = new Gradient('linear') const spy = spyOn(Container.prototype, 'attr') gradient.attr(1, 2, 3) gradient.attr('transform', 2, 3) expect(spy).toHaveBeenCalledWith(1, 2, 3) expect(spy).toHaveBeenCalledWith('gradientTransform', 2, 3) }) }) describe('bbox()', () => { it('returns an empty box', () => { expect(new Gradient('linear').bbox().isNulled()).toBe(true) }) }) describe('targets()', () => { it('gets all targets of this gradient', () => { const canvas = SVG().addTo(container) const gradient = canvas.gradient('linear') const rect = canvas.rect(100, 100).fill(gradient) expect(gradient.targets()).toEqual([rect]) }) }) describe('toString()', () => { it('calls url() and returns the result', () => { const gradient = new Gradient('linear') expect(gradient.toString()).toBe(gradient.url()) }) }) describe('update()', () => { it('clears the element', () => { const gradient = new Gradient('linear') gradient.stop(0.1, '#fff') expect(gradient.update().children()).toEqual([]) }) it('executes a function in the context of the gradient', () => { const gradient = new Gradient('linear') const spy = createSpy('gradient') gradient.update(spy) expect(spy.calls.all()).toEqual([ objectContaining({ object: gradient, args: [gradient] }) ]) }) }) describe('url()', () => { it('returns url(#id)', () => { const gradient = new Gradient('linear').id('foo') expect(gradient.url()).toBe('url(#foo)') }) }) describe('Container', () => { it('relays the call to defs', () => { const canvas = new SVG() const defs = canvas.defs() const spy = spyOn(defs, 'gradient').and.callThrough() const spy2 = createSpy('gradient') canvas.gradient('linear', spy2) expect(spy).toHaveBeenCalledWith('linear', spy2) expect(spy2).toHaveBeenCalled() }) }) describe('Defs', () => { it('creates a pattern in the defs', () => { const canvas = new SVG() const defs = canvas.defs() const spy = createSpy('gradient') const gradient = defs.gradient('linear', spy) expect(gradient).toEqual(any(Gradient)) expect(gradient.type).toBe('linearGradient') expect(defs.children()).toEqual([gradient]) expect(spy).toHaveBeenCalled() }) }) }) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������svg.js-3.2.4/spec/spec/elements/Image.js������������������������������������������������������������0000664�0000000�0000000�00000007555�14637234162�0020036�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* globals describe, expect, it, jasmine */ import { Image, Pattern, SVG } from '../../../src/main.js' import { getWindow } from '../../../src/utils/window.js' const { any, objectContaining, createSpy } = jasmine const url = 'spec/fixtures/pixel.png' describe('Image.js', () => { describe('()', () => { it('creates a new object of type Image', () => { expect(new Image()).toEqual(any(Image)) }) it('sets passed attributes on the element', () => { expect(new Image({ id: 'foo' }).id()).toBe('foo') }) }) describe('load()', () => { it('is a noop when url is falsy and returns itself', () => { const image = Object.freeze(new Image()) expect(image.load()).toBe(image) }) it('executes a callback when the image is loaded', (done) => { const spy = createSpy('image', (e) => { expect(e.target.complete).toBe(true) expect(spy.calls.all()).toEqual([ objectContaining({ object: image, args: [any(getWindow().Event)] }) ]) done() }).and.callThrough() const image = new Image().load(url, spy) }) it('errors when image cant be loaded', () => { // cant test this because of jasmine timeouts and browser disconnects }) // it('sets the width and height of the image automatically', () => { // const image = new Image('spec/fixtures/pixel.png') // }) it('should set width and height automatically if no size is given', (done) => { const image = new Image().load(url, () => { expect(image.attr('height')).toBe(1) expect(image.attr('width')).toBe(1) done() }) }) it('should not change with and height when size already set', (done) => { const image = new Image() .load(url, () => { expect(image.attr('height')).toBe(100) expect(image.attr('width')).toBe(100) done() }) .size(100, 100) }) it('changes size of pattern to image size if parent is pattern and size is 0', (done) => { const pattern = new Pattern().size(0, 0) new Image() .load(url, () => { expect(pattern.attr('height')).toBe(100) expect(pattern.attr('width')).toBe(100) done() }) .size(100, 100) .addTo(pattern) }) it('does not change size of pattern if pattern has a size set', (done) => { const pattern = new Pattern().size(50, 50) new Image() .load(url, () => { expect(pattern.attr('height')).toBe(50) expect(pattern.attr('width')).toBe(50) done() }) .size(100, 100) .addTo(pattern) }) }) describe('Container', () => { describe('image()', () => { it('creates image in the container', () => { const canvas = SVG() const image = canvas.image(url) expect(image).toBe(image) expect(canvas.children()).toEqual([image]) }) }) }) describe('attribute hook', () => { it('creates a pattern in defs when value is an image and puts image there', () => { const canvas = SVG() const image = new Image() canvas.rect(100, 100).attr('something', image) expect(canvas.defs().children()).toEqual([any(Pattern)]) expect(canvas.defs().findOne('image')).toBe(image) }) it('creates an image from image path in defs with pattern when attr is fill', () => { const canvas = SVG() canvas.rect(100, 100).attr('fill', url) expect(canvas.defs().children()).toEqual([any(Pattern)]) expect(canvas.defs().findOne('image').attr('href')).toBe(url) }) it('creates an image from image path in defs with pattern when attr is stroke', () => { const canvas = SVG() canvas.rect(100, 100).attr('stroke', url) expect(canvas.defs().children()).toEqual([any(Pattern)]) expect(canvas.defs().findOne('image').attr('href')).toBe(url) }) }) }) ���������������������������������������������������������������������������������������������������������������������������������������������������svg.js-3.2.4/spec/spec/elements/Line.js�������������������������������������������������������������0000664�0000000�0000000�00000010262�14637234162�0017670�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* globals describe, expect, it, beforeEach, spyOn, jasmine, container */ import { Line, PointArray, SVG, G } from '../../../src/main.js' const { any, objectContaining } = jasmine describe('Line.js', () => { let line beforeEach(() => { line = new Line() }) describe('()', () => { it('creates a new object of type Line', () => { expect(new Line()).toEqual(any(Line)) }) it('sets passed attributes on the element', () => { expect(new Line({ id: 'foo' }).id()).toBe('foo') }) }) describe('array()', () => { it('returns a PointArray containing the points of the line', () => { const array = line.plot(1, 2, 3, 4).array() expect(array).toEqual(any(PointArray)) expect(array).toEqual([ [1, 2], [3, 4] ]) }) }) describe('move()', () => { it('returns itself', () => { expect(line.move(0, 0)).toBe(line) }) it('moves the line along x and y axis', () => { const canvas = SVG().addTo(container) const line = canvas.line(1, 2, 3, 4) line.move(50, 50) expect(line.bbox()).toEqual( objectContaining({ x: 50, y: 50, width: 2, height: 2 }) ) }) }) describe('plot()', () => { it('relays to array() as getter', () => { const spy = spyOn(line, 'array') line.plot() expect(spy).toHaveBeenCalled() }) it('calls attr with line attributes when 4 parameters given', () => { const spy = spyOn(line, 'attr') line.plot(1, 2, 3, 4) expect(spy).toHaveBeenCalledWith({ x1: 1, y1: 2, x2: 3, y2: 4 }) }) it('calls attr with line attributes when string given', () => { const spy = spyOn(line, 'attr') line.plot('1, 2, 3, 4') expect(spy).toHaveBeenCalledWith({ x1: 1, y1: 2, x2: 3, y2: 4 }) }) it('calls attr with line attributes when array given', () => { const spy = spyOn(line, 'attr') line.plot([1, 2, 3, 4]) expect(spy).toHaveBeenCalledWith({ x1: 1, y1: 2, x2: 3, y2: 4 }) }) it('calls attr with line attributes when multi array given', () => { const spy = spyOn(line, 'attr') line.plot([ [1, 2], [3, 4] ]) expect(spy).toHaveBeenCalledWith({ x1: 1, y1: 2, x2: 3, y2: 4 }) }) it('calls attr with line attributes when PointArray given', () => { const spy = spyOn(line, 'attr') line.plot( new PointArray([ [1, 2], [3, 4] ]) ) expect(spy).toHaveBeenCalledWith({ x1: 1, y1: 2, x2: 3, y2: 4 }) }) }) describe('size()', () => { it('returns itself', () => { expect(line.size(50, 50)).toBe(line) }) it('sets the size of the line', () => { const canvas = SVG().addTo(container) const line = canvas.line(1, 2, 3, 4) line.size(50, 50) expect(line.bbox()).toEqual( objectContaining({ width: 50, height: 50, x: 1, y: 2 }) ) }) it('changes height proportionally', () => { const canvas = SVG().addTo(container) const line = canvas.line(1, 2, 3, 4) line.size(50, null) expect(line.bbox()).toEqual( objectContaining({ width: 50, height: 50, x: 1, y: 2 }) ) }) it('changes width proportionally', () => { const canvas = SVG().addTo(container) const line = canvas.line(1, 2, 3, 4) line.size(null, 50) expect(line.bbox()).toEqual( objectContaining({ width: 50, height: 50, x: 1, y: 2 }) ) }) }) describe('Container', () => { describe('line()', () => { it('creates a line with given points', () => { const group = new G() const line = group.line(1, 2, 3, 4) expect(line.array()).toEqual([ [1, 2], [3, 4] ]) expect(line).toEqual(any(Line)) }) it('defaults to zero line', () => { const group = new G() const line = group.line() expect(line.array()).toEqual([ [0, 0], [0, 0] ]) expect(line).toEqual(any(Line)) }) }) }) }) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������svg.js-3.2.4/spec/spec/elements/Marker.js�����������������������������������������������������������0000664�0000000�0000000�00000012257�14637234162�0020230�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* globals describe, expect, it, beforeEach, jasmine, container */ import { Marker, SVG, Defs } from '../../../src/main.js' const { any } = jasmine describe('Marker.js', function () { describe('()', () => { it('creates a new object of type Marker', () => { expect(new Marker()).toEqual(any(Marker)) }) it('sets passed attributes on the element', () => { expect(new Marker({ id: 'foo' }).id()).toBe('foo') }) }) describe('width()', () => { it('sets the markerWidth attribute', () => { const marker = new Marker().width(100) expect(marker.attr('markerWidth')).toBe(100) }) }) describe('height()', () => { it('sets the markerHeight attribute', () => { const marker = new Marker().height(100) expect(marker.attr('markerHeight')).toBe(100) }) }) describe('orient()', () => { it('sets the orient attribute', () => { const marker = new Marker().orient('auto') expect(marker.attr('orient')).toBe('auto') }) }) describe('ref()', () => { it('sets refX and refY attribute', () => { const marker = new Marker().ref(10, 20) expect(marker.attr('refX')).toBe(10) expect(marker.attr('refY')).toBe(20) }) }) describe('update()', () => { it('updates the marker', () => { const marker = new Marker() marker.rect(100, 100) marker.update(function (m) { m.rect(100, 100) expect(this).toBe(marker) expect(m).toBe(marker) }) expect(marker.children().length).toBe(1) }) }) describe('toString()', () => { it('returns the url identifier for this marker', () => { const marker = new Marker() expect(marker.toString()).toBe('url(#' + marker.id() + ')') }) }) describe('Container', () => { var canvas var group beforeEach(() => { canvas = SVG() group = canvas.group() }) describe('marker()', () => { it('creates an instance of Marker', () => { const marker = group.marker(10, 12) expect(marker instanceof Marker).toBeTrue() }) it('creates marker in defs', () => { const marker = group.marker(10, 12) expect(marker.parent() instanceof Defs).toBeTruthy() }) it('sets the refX to half of the given width and height', () => { const marker = group.marker(10, 12) expect(marker.node.getAttribute('refX')).toBe('5') expect(marker.node.getAttribute('refY')).toBe('6') }) }) }) describe('Defs', () => { describe('marker()', () => { it('creates a marker in the defs and sets all attributes', () => { const canvas = SVG() const defs = canvas.defs() const marker = defs.marker(10, 12) expect(marker.attr('refX')).toBe(5) expect(marker.attr('refY')).toBe(6) expect(marker.attr('markerWidth')).toBe(10) expect(marker.attr('markerHeight')).toBe(12) expect(marker.attr('viewBox')).toBe('0 0 10 12') expect(marker.attr('orient')).toBe('auto') expect(marker).toEqual(any(Marker)) expect(defs.children()).toEqual([marker]) }) }) }) describe('marker', () => { var path, marker, canvas beforeEach(() => { // because we use `reference` here we need to put it into the live dom canvas = new SVG().addTo(container) path = canvas.path( 'M 100 200 C 200 100 300 0 400 100 C 500 200 600 300 700 200 C 800 100 900 100 900 100' ) }) it('creates an instance of Marker', () => { path.marker('mid', 10, 12, function (add) { add.rect(10, 12) this.ref(5, 6) }) expect(path.reference('marker-mid').children().length).toBe(1) expect(path.reference('marker-mid').attr('refX')).toBe(5) expect(path.reference('marker-mid') instanceof Marker).toBeTruthy() }) describe('marker()', () => { it('returns the target element', () => { expect(path.marker('start', 10, 12)).toBe(path) }) it('creates a marker and applies it to the marker-start attribute', () => { path.marker('start', 10, 12) marker = path.reference('marker-start') expect(path.node.getAttribute('marker-start')).toBe(marker.toString()) }) it('creates a marker and applies it to the marker-mid attribute', () => { path.marker('mid', 10, 12) marker = path.reference('marker-mid') expect(path.node.getAttribute('marker-mid')).toBe(marker.toString()) }) it('creates a marker and applies it to the marker-end attribute', () => { path.marker('end', 10, 12) marker = path.reference('marker-end') expect(path.node.getAttribute('marker-end')).toBe(marker.toString()) }) it('creates a marker and applies it to the marker-end attribute', () => { path.marker('all', 10, 12) marker = path.reference('marker') expect(path.node.getAttribute('marker')).toBe(marker.toString()) }) it('accepts an instance of an existing marker element as the second argument', () => { marker = new Marker().size(11, 11) path.marker('mid', marker) expect(path.node.getAttribute('marker-mid')).toBe(marker.toString()) }) }) }) }) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������svg.js-3.2.4/spec/spec/elements/Mask.js�������������������������������������������������������������0000664�0000000�0000000�00000005565�14637234162�0017706�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* globals describe, expect, it, spyOn, jasmine, container */ import { Mask, SVG, Container, Rect } from '../../../src/main.js' const { any } = jasmine describe('Mask.js', () => { describe('()', () => { it('creates a new object of type Mask', () => { expect(new Mask()).toEqual(any(Mask)) }) it('sets passed attributes on the element', () => { expect(new Mask({ id: 'foo' }).id()).toBe('foo') }) }) describe('remove()', () => { it('unmasks all targets', () => { const canvas = SVG().addTo(container) const mask = canvas.mask() const rect = canvas.rect(100, 100).maskWith(mask) expect(mask.remove()).toBe(mask) expect(rect.masker()).toBe(null) }) it('calls remove on parent class', () => { const mask = new Mask() const spy = spyOn(Container.prototype, 'remove') mask.remove() expect(spy).toHaveBeenCalled() }) }) describe('targets()', () => { it('gets all targets of this maskPath', () => { const canvas = SVG().addTo(container) const mask = canvas.mask() const rect = canvas.rect(100, 100).maskWith(mask) expect(mask.targets()).toEqual([rect]) }) }) describe('Container', () => { describe('mask()', () => { it('creates a maskPath in the defs', () => { const canvas = SVG() const mask = canvas.mask() expect(mask).toEqual(any(Mask)) expect(canvas.defs().children()).toEqual([mask]) }) }) }) describe('Element', () => { describe('masker()', () => { it('returns the instance of Mask the current element is masked with', () => { const canvas = SVG().addTo(container) const mask = canvas.mask() const rect = canvas.rect(100, 100).maskWith(mask) expect(rect.masker()).toEqual(mask) }) it('returns null if no maskPath was found', () => { expect(new Rect().masker()).toBe(null) }) }) describe('maskWith()', () => { it('sets the mask attribute on the element to the id of the maskPath', () => { const mask = new Mask().id('foo') const rect = new Rect().maskWith(mask) expect(rect.attr('mask')).toBe('url(#foo)') }) it('creates a maskPath and appends the passed element to it to mask current element', () => { const canvas = SVG().addTo(container) const circle = canvas.circle(40) const rect = canvas.rect(100, 100).maskWith(circle) expect(circle.parent()).toEqual(any(Mask)) expect(rect.attr('mask')).toBe(`url(#${circle.parent().id()})`) }) }) describe('unmask()', () => { it('sets the mask-target attribute to null and returns itself', () => { const mask = new Mask().id('foo') const rect = new Rect().maskWith(mask) expect(rect.unmask()).toBe(rect) expect(rect.attr('mask')).toBe(undefined) }) }) }) }) �������������������������������������������������������������������������������������������������������������������������������������������svg.js-3.2.4/spec/spec/elements/Path.js�������������������������������������������������������������0000664�0000000�0000000�00000012616�14637234162�0017702�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* globals describe, expect, beforeEach, it, spyOn, jasmine, container */ import { Path, SVG, PathArray } from '../../../src/main.js' const { any, objectContaining } = jasmine describe('Path.js', () => { let path beforeEach(() => { path = new Path() }) describe('()', () => { it('creates a new object of type Path', () => { expect(new Path()).toEqual(any(Path)) }) it('sets passed attributes on the element', () => { expect(new Path({ id: 'foo' }).id()).toBe('foo') }) }) describe('array()', () => { it('returns the underlying PathArray', () => { const array = path.plot('M1 2 3 4').array() expect(array).toEqual(any(PathArray)) expect(array).toEqual([ ['M', 1, 2], ['L', 3, 4] ]) }) }) describe('clear()', () => { it('clears the array cache and returns itself', () => { const array = path.plot('M1 2 3 4').array() expect(path.clear()).toBe(path) expect(array).not.toBe(path._array) }) }) describe('height()', () => { it('gets the height of the path', () => { const canvas = SVG().addTo(container) const path = canvas.path('M0 0 50, 50') expect(path.height()).toBe(50) }) it('sets the height of the path and returns itself', () => { const canvas = SVG().addTo(container) const path = canvas.path('M0 0 50, 50') expect(path.height(100)).toBe(path) expect(path.height()).toBe(100) }) }) describe('move()', () => { it('returns itself', () => { expect(path.move(0, 0)).toBe(path) }) it('moves the path along x and y axis', () => { const canvas = SVG().addTo(container) const path = canvas.path('M0 0 50, 50') path.move(50, 50) expect(path.bbox()).toEqual( objectContaining({ x: 50, y: 50, width: 50, height: 50 }) ) }) }) describe('plot()', () => { it('relays to array() as getter', () => { const spy = spyOn(path, 'array') path.plot() expect(spy).toHaveBeenCalled() }) it('works by passing a string', () => { const spy = spyOn(path, 'attr') path.plot('M0 0 50 50') expect(spy).toHaveBeenCalledWith('d', 'M0 0 50 50') }) it('works with flat array', () => { const spy = spyOn(path, 'attr') path.plot(['M', 0, 0, 'L', 50, 50]) expect(spy).toHaveBeenCalledWith('d', [ ['M', 0, 0], ['L', 50, 50] ]) }) it('works with multi array', () => { const spy = spyOn(path, 'attr') path.plot([ ['M', 0, 0], ['L', 50, 50] ]) expect(spy).toHaveBeenCalledWith('d', [ ['M', 0, 0], ['L', 50, 50] ]) }) it('works with PathArray', () => { const spy = spyOn(path, 'attr') path.plot( new PathArray([ ['M', 0, 0], ['L', 50, 50] ]) ) expect(spy).toHaveBeenCalledWith('d', [ ['M', 0, 0], ['L', 50, 50] ]) }) }) describe('size()', () => { it('returns itself', () => { expect(path.size(50, 50)).toBe(path) }) it('sets the size of the path', () => { const canvas = SVG().addTo(container) const path = canvas.path('M0 0 50, 50') path.size(100, 100) expect(path.bbox()).toEqual( objectContaining({ width: 100, height: 100, x: 0, y: 0 }) ) }) it('changes height proportionally', () => { const canvas = SVG().addTo(container) const path = canvas.path('M0 0 50, 50') path.size(100, null) expect(path.bbox()).toEqual( objectContaining({ width: 100, height: 100, x: 0, y: 0 }) ) }) it('changes width proportionally', () => { const canvas = SVG().addTo(container) const path = canvas.path('M0 0 50, 50') path.size(null, 100) expect(path.bbox()).toEqual( objectContaining({ width: 100, height: 100, x: 0, y: 0 }) ) }) }) describe('width()', () => { it('gets the width of the path', () => { const canvas = SVG().addTo(container) const path = canvas.path('M0 0 50, 50') expect(path.width()).toBe(50) }) it('sets the width of the path and returns itself', () => { const canvas = SVG().addTo(container) const path = canvas.path('M0 0 50, 50') expect(path.width(100)).toBe(path) expect(path.width()).toBe(100) }) }) describe('x()', () => { it('gets the x position of the path', () => { const canvas = SVG().addTo(container) const path = canvas.path('M10 10 50, 50') expect(path.x()).toBe(10) }) it('sets the x position of the path and returns itself', () => { const canvas = SVG().addTo(container) const path = canvas.path('M0 0 50, 50') expect(path.x(100)).toBe(path) expect(path.x()).toBe(100) }) }) describe('y()', () => { it('gets the y position of the path', () => { const canvas = SVG().addTo(container) const path = canvas.path('M10 10 50, 50') expect(path.y()).toBe(10) }) it('sets the y position of the path and returns itself', () => { const canvas = SVG().addTo(container) const path = canvas.path('M0 0 50, 50') expect(path.y(100)).toBe(path) expect(path.y()).toBe(100) }) }) }) ������������������������������������������������������������������������������������������������������������������svg.js-3.2.4/spec/spec/elements/Pattern.js����������������������������������������������������������0000664�0000000�0000000�00000006030�14637234162�0020414�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* globals describe, expect, it, spyOn, jasmine, container */ import { Pattern, SVG, Container } from '../../../src/main.js' const { any, objectContaining, createSpy } = jasmine describe('Pattern.js', () => { describe('()', () => { it('creates a new object of type Pattern', () => { const pattern = new Pattern() expect(pattern).toEqual(any(Pattern)) }) it('sets passed attributes on the element', () => { expect(new Pattern({ id: 'foo' }).id()).toBe('foo') }) }) describe('attr()', () => { it('relays to parents attr method for any call except transformation', () => { const pattern = new Pattern() const spy = spyOn(Container.prototype, 'attr') pattern.attr(1, 2, 3) pattern.attr('transform', 2, 3) expect(spy).toHaveBeenCalledWith(1, 2, 3) expect(spy).toHaveBeenCalledWith('patternTransform', 2, 3) }) }) describe('bbox()', () => { it('returns an empty box', () => { expect(new Pattern().bbox().isNulled()).toBe(true) }) }) describe('targets()', () => { it('gets all targets of this pattern', () => { const canvas = SVG().addTo(container) const pattern = canvas.pattern() const rect = canvas.rect(100, 100).fill(pattern) expect(pattern.targets()).toEqual([rect]) }) }) describe('toString()', () => { it('calls url() and returns the result', () => { const pattern = new Pattern() expect(pattern.toString()).toBe(pattern.url()) }) }) describe('update()', () => { it('clears the element', () => { const pattern = new Pattern() pattern.rect(100, 100) expect(pattern.update().children()).toEqual([]) }) it('executes a function in the context of the pattern', () => { const pattern = new Pattern() const spy = createSpy('pattern') pattern.update(spy) expect(spy.calls.all()).toEqual([ objectContaining({ object: pattern, args: [pattern] }) ]) }) }) describe('url()', () => { it('returns url(#id)', () => { const pattern = new Pattern().id('foo') expect(pattern.url()).toBe('url(#foo)') }) }) describe('Container', () => { it('relays the call to defs', () => { const canvas = new SVG() const defs = canvas.defs() const spy = spyOn(defs, 'pattern').and.callThrough() const spy2 = createSpy('pattern') canvas.pattern(100, 100, spy2) expect(spy).toHaveBeenCalledWith(100, 100, spy2) expect(spy2).toHaveBeenCalled() }) }) describe('Defs', () => { it('creates a pattern in the defs and sets its size and position', () => { const canvas = new SVG() const defs = canvas.defs() const spy = createSpy('pattern') const pattern = defs.pattern(100, 100, spy) expect(pattern).toEqual(any(Pattern)) expect(defs.children()).toEqual([pattern]) expect(spy).toHaveBeenCalled() expect(pattern.attr(['x', 'y', 'width', 'height'])).toEqual({ x: 0, y: 0, width: 100, height: 100 }) }) }) }) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������svg.js-3.2.4/spec/spec/elements/Polygon.js����������������������������������������������������������0000664�0000000�0000000�00000001757�14637234162�0020441�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* globals describe, expect, it, jasmine */ import { Polygon, G } from '../../../src/main.js' const { any } = jasmine describe('Polygon.js', () => { describe('()', () => { it('creates a new object of type Polygon', () => { expect(new Polygon()).toEqual(any(Polygon)) }) it('sets passed attributes on the element', () => { expect(new Polygon({ id: 'foo' }).id()).toBe('foo') }) }) describe('Container', () => { describe('polygon()', () => { it('creates a polygon with given points', () => { const group = new G() const polygon = group.polygon([1, 2, 3, 4]) expect(polygon.array()).toEqual([ [1, 2], [3, 4] ]) expect(polygon).toEqual(any(Polygon)) }) }) it('creates a polygon with one point by default', () => { const group = new G() const polygon = group.polygon() expect(polygon.array()).toEqual([[0, 0]]) expect(polygon).toEqual(any(Polygon)) }) }) }) �����������������svg.js-3.2.4/spec/spec/elements/Polyline.js���������������������������������������������������������0000664�0000000�0000000�00000002016�14637234162�0020572�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* globals describe, expect, it, jasmine */ import { Polyline, G } from '../../../src/main.js' const { any } = jasmine describe('Polyline.js', () => { describe('()', () => { it('creates a new object of type Polyline', () => { expect(new Polyline()).toEqual(any(Polyline)) }) it('sets passed attributes on the element', () => { expect(new Polyline({ id: 'foo' }).id()).toBe('foo') }) }) describe('Container', () => { describe('polyline()', () => { it('creates a polyline with given points', () => { const group = new G() const polyline = group.polyline([1, 2, 3, 4]) expect(polyline.array()).toEqual([ [1, 2], [3, 4] ]) expect(polyline).toEqual(any(Polyline)) }) it('creates a polyline with one point by default', () => { const group = new G() const polyline = group.polyline() expect(polyline.array()).toEqual([[0, 0]]) expect(polyline).toEqual(any(Polyline)) }) }) }) }) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������svg.js-3.2.4/spec/spec/elements/Rect.js�������������������������������������������������������������0000664�0000000�0000000�00000001371�14637234162�0017677�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* globals describe, expect, it, jasmine */ import { Rect, G } from '../../../src/main.js' const { any } = jasmine describe('Rect.js', () => { describe('()', () => { it('creates a new object of type Rect', () => { expect(new Rect()).toEqual(any(Rect)) }) it('sets passed attributes on the element', () => { expect(new Rect({ id: 'foo' }).id()).toBe('foo') }) }) describe('Container', () => { describe('rect()', () => { it('creates a rect with given size', () => { const group = new G() const rect = group.rect(100, 100) expect(rect.attr(['width', 'height'])).toEqual({ width: 100, height: 100 }) expect(rect).toEqual(any(Rect)) }) }) }) }) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������svg.js-3.2.4/spec/spec/elements/Shape.js������������������������������������������������������������0000664�0000000�0000000�00000000671�14637234162�0020044�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* globals describe, expect, it, jasmine */ import { Shape, create } from '../../../src/main.js' const { any } = jasmine describe('Rect.js', () => { describe('()', () => { it('creates a new object of type Shape', () => { expect(new Shape(create('rect'))).toEqual(any(Shape)) }) it('sets passed attributes on the element', () => { expect(new Shape(create('rect'), { id: 'foo' }).id()).toBe('foo') }) }) }) �����������������������������������������������������������������������svg.js-3.2.4/spec/spec/elements/Stop.js�������������������������������������������������������������0000664�0000000�0000000�00000005052�14637234162�0017727�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* globals describe, expect, it, jasmine */ import { Stop, Gradient } from '../../../src/main.js' const { any } = jasmine describe('Stop.js', () => { describe('()', () => { it('creates a new object of type Stop', () => { expect(new Stop()).toEqual(any(Stop)) }) it('sets passed attributes on the element', () => { expect(new Stop({ id: 'foo' }).id()).toBe('foo') }) }) describe('update()', () => { it('sets offset, color and opacity with 3 arguments given', () => { const stop = new Stop() stop.update(0.1, '#ffffff', 0.5) expect(stop.attr('offset')).toBe(0.1) expect(stop.attr('stop-color')).toBe('#ffffff') expect(stop.attr('stop-opacity')).toBe(0.5) }) it('sets offset, color and opacity with object given', () => { const stop = new Stop() stop.update({ offset: 0.1, color: '#ffffff', opacity: 0.5 }) expect(stop.attr('offset')).toBe(0.1) expect(stop.attr('stop-color')).toBe('#ffffff') expect(stop.attr('stop-opacity')).toBe(0.5) }) it('sets efault values if not all supplied', () => { let stop = new Stop() stop.update({ offset: 0.1 }) expect(stop.attr('offset')).toBe(0.1) expect(stop.attr('stop-color')).toBe('#000000') expect(stop.attr('stop-opacity')).toBe(1) stop = new Stop() stop.update({ color: '#ffffff' }) expect(stop.attr('offset')).toBe(0) expect(stop.attr('stop-color')).toBe('#ffffff') expect(stop.attr('stop-opacity')).toBe(1) stop = new Stop() stop.update({ opacity: 0.5 }) expect(stop.attr('offset')).toBe(0) expect(stop.attr('stop-color')).toBe('#000000') expect(stop.attr('stop-opacity')).toBe(0.5) }) }) describe('Gradient', () => { describe('stop()', () => { it('creates a stop in the gradient with 3 arguments', () => { const gradient = new Gradient('linear') const stop = gradient.stop(0.1, '#ffffff', 0.5) expect(stop).toEqual(any(Stop)) expect(stop.attr('offset')).toBe(0.1) expect(stop.attr('stop-color')).toBe('#ffffff') expect(stop.attr('stop-opacity')).toBe(0.5) }) it('creates stop in the gradient with object given', () => { const gradient = new Gradient('linear') const stop = gradient.stop({ offset: 0.1, color: '#ffffff', opacity: 0.5 }) expect(stop.attr('offset')).toBe(0.1) expect(stop.attr('stop-color')).toBe('#ffffff') expect(stop.attr('stop-opacity')).toBe(0.5) }) }) }) }) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������svg.js-3.2.4/spec/spec/elements/Style.js������������������������������������������������������������0000664�0000000�0000000�00000005334�14637234162�0020105�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* globals describe, expect, it, jasmine */ import { Style, G } from '../../../src/main.js' const { any } = jasmine describe('Style.js', () => { describe('()', () => { it('creates a new object of type Style', () => { expect(new Style()).toEqual(any(Style)) }) it('sets passed attributes on the element', () => { expect(new Style({ id: 'foo' }).id()).toBe('foo') }) }) describe('addText()', () => { it('appends a string to the current textContent and returns itself', () => { const style = new Style() expect(style.addText('foo').node.textContent).toBe('foo') expect(style.addText('bar').node.textContent).toBe('foobar') expect(style.addText('foobar')).toBe(style) }) it('appends an empty string if nothing passed', () => { const style = new Style() expect(style.addText().node.textContent).toBe('') }) }) describe('font()', () => { it('adds a font-face rule to load a custom font and returns itself', () => { const style = new Style() expect(style.font('fontName', 'url')).toBe(style) expect(style.node.textContent).toBe( '@font-face{font-family:fontName;src:url;}' ) }) it('adds extra parameters if wanted', () => { const style = new Style() style.font('fontName', 'url', { foo: 'bar' }) expect(style.node.textContent).toBe( '@font-face{font-family:fontName;src:url;foo:bar;}' ) }) }) describe('rule()', () => { it('adds a css rule', () => { const style = new Style() expect(style.rule('#id', { fontSize: 15 })).toBe(style) expect(style.node.textContent).toBe('#id{font-size:15;}') }) it('adds only selector when no obj was given', () => { const style = new Style() style.rule('#id') expect(style.node.textContent).toBe('#id') }) it('adds nothing if no selector was given', () => { const style = new Style() style.rule() expect(style.node.textContent).toBe('') }) }) describe('Container', () => { describe('style()', () => { it('creates a style element in the container and adds a rule', () => { const g = new G() const style = g.style('#id', { fontSize: 15 }) expect(style).toEqual(any(Style)) expect(style.node.textContent).toBe('#id{font-size:15;}') }) }) describe('fontface()', () => { it('creates a style element in the container and adds a font-face rule', () => { const g = new G() const style = g.fontface('fontName', 'url', { foo: 'bar' }) expect(style).toEqual(any(Style)) expect(style.node.textContent).toBe( '@font-face{font-family:fontName;src:url;foo:bar;}' ) }) }) }) }) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������svg.js-3.2.4/spec/spec/elements/Svg.js��������������������������������������������������������������0000664�0000000�0000000�00000010207�14637234162�0017537�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* globals describe, expect, it, jasmine, container */ import { Svg, SVG, Defs } from '../../../src/main.js' import { svg as ns, xlink } from '../../../src/modules/core/namespaces.js' import { getWindow } from '../../../src/utils/window.js' const { any } = jasmine describe('Svg.js', () => { describe('()', () => { it('creates a new object of type Svg', () => { expect(new Svg()).toEqual(any(Svg)) }) it('sets passed attributes on the element', () => { expect(new Svg({ id: 'foo' }).id()).toBe('foo') }) it('creates namespaces on creation', () => { const svg = new Svg() expect(svg.attr('xmlns')).toBe(ns) expect(svg.attr('version')).toBe(1.1) expect(svg.attr('xmlns:xlink')).toBe(xlink) }) }) describe('defs()', () => { it('returns the defs if its the root svg', () => { const svg = new Svg() const defs = new Defs().addTo(svg) expect(svg.defs()).toBe(defs) }) it('returns the defs if its not the root svg', () => { const svg = new Svg() const defs = new Defs().addTo(svg) const nested = new Svg().addTo(svg) expect(nested.defs()).toBe(defs) }) it('creates the defs if not found', () => { const svg = new SVG() expect(svg.findOne('defs')).toBe(null) const defs = svg.defs() expect(svg.findOne('defs')).toBe(defs) }) }) describe('namespace()', () => { it('returns itself', () => { const svg = SVG('') expect(svg.namespace()).toBe(svg) }) it('creates the namespace attributes on the svg', () => { const svg = SVG('') expect(svg.attr('xmlns')).toBe(undefined) svg.namespace() expect(svg.attr('xmlns')).toBe(ns) expect(svg.attr('version')).toBe(1.1) expect(svg.attr('xmlns:xlink')).toBe(xlink) }) }) describe('isRoot()', () => { it('returns true if svg is the root svg', () => { const canvas = SVG().addTo(container) expect(canvas.isRoot()).toBe(true) }) it('returns true if its detached from the dom', () => { const svg = new Svg() expect(svg.isRoot()).toBe(true) }) it('returns true if its the root child of the document', () => { // cannot be tested here }) it('returns false if its the child of a document-fragment', () => { const fragment = getWindow().document.createDocumentFragment() const svg = new Svg().addTo(fragment) expect(svg.isRoot()).toBe(false) }) it('returns false if its a child of another svg element', () => { const svg = new Svg() const nested = new Svg().addTo(svg) expect(nested.isRoot()).toBe(false) }) }) describe('removeNamespace()', () => { it('returns itself', () => { const svg = new Svg() expect(svg.removeNamespace()).toBe(svg) }) it('removes the namespace attributes from the svg element', () => { const svg = new Svg() expect(svg.attr('xmlns')).toBe(ns) svg.removeNamespace() expect(svg.attr('xmlns')).toBe(undefined) expect(svg.attr('version')).toBe(undefined) expect(svg.attr('xmlns:xlink')).toBe(undefined) expect(svg.attr('xmlns:svgjs')).toBe(undefined) }) }) describe('root()', () => { it('returns itself if its the root svg', () => { const svg = new Svg() expect(svg.root()).toBe(svg) }) it('returns the actual root if its not the root svg', () => { const svg = new Svg() const nested = new Svg().addTo(svg) expect(nested.root()).toBe(svg) }) }) describe('Container', () => { describe('nested()', () => { it('creates an svg element in the container', () => { const svg = new Svg() const nested = svg.nested() expect(nested).toEqual(any(Svg)) expect(nested.parent()).toBe(svg) }) it('has no namespaces set', () => { const svg = new Svg() const nested = svg.nested() expect(nested.attr('xmlns')).toBe(undefined) expect(nested.attr('version')).toBe(undefined) expect(nested.attr('xmlns:xlink')).toBe(undefined) expect(nested.attr('xmlns:svgjs')).toBe(undefined) }) }) }) }) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������svg.js-3.2.4/spec/spec/elements/Symbol.js�����������������������������������������������������������0000664�0000000�0000000�00000001301�14637234162�0020240�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* globals describe, expect, it, jasmine */ import { Symbol, G } from '../../../src/main.js' const { any } = jasmine describe('Symbol.js', () => { describe('()', () => { it('creates a new object of type Symbol', () => { expect(new Symbol()).toEqual(any(Symbol)) }) it('sets passed attributes on the element', () => { expect(new Symbol({ id: 'foo' }).id()).toBe('foo') }) }) describe('Container', () => { describe('symbol()', () => { it('creates a symbol in the container', () => { const g = new G() const symbol = g.symbol() expect(symbol).toEqual(any(Symbol)) expect(g.children()).toEqual([symbol]) }) }) }) }) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������svg.js-3.2.4/spec/spec/elements/Text.js�������������������������������������������������������������0000664�0000000�0000000�00000013350�14637234162�0017726�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* globals describe, expect, it, spyOn jasmine, container */ import { Text, Number as SVGNumber, SVG, G, Path, TextPath, Svg } from '../../../src/main.js' const { any } = jasmine describe('Text.js', () => { describe('()', () => { it('creates a new object of type Text', () => { expect(new Text()).toEqual(any(Text)) }) it('sets passed attributes on the element', () => { expect(new Text({ id: 'foo' }).id()).toBe('foo') }) it('recovers leading data from dom', () => { const svg = new Svg().namespace() svg.text('').leading(3) const newSvg = SVG(svg.svg()) expect(newSvg.findOne('text').leading().valueOf()).toBe(3) }) }) describe('text()', () => { it('sets the text content of the tspan and returns itself', () => { const text = new Text() expect(text.text('Hello World')).toBe(text) expect(text.node.textContent).toBe('Hello World') }) it('creates tspans for every line', () => { const text = new Text().text('Hello World\nHow is it\ngoing') expect(text.children().length).toBe(3) expect(text.get(0).node.textContent).toBe('Hello World') expect(text.get(1).node.textContent).toBe('How is it') expect(text.get(2).node.textContent).toBe('going') }) it('increases dy after empty line', () => { const canvas = SVG().addTo(container) const text = canvas.text('Hello World\n\nHow is it\ngoing') expect(text.children().length).toBe(4) expect(text.get(0).node.textContent).toBe('Hello World') expect(text.get(1).node.textContent).toBe('') expect(text.get(2).node.textContent).toBe('How is it') expect(text.get(3).node.textContent).toBe('going') expect(text.get(2).dy()).toBe(text.get(3).dy() * 2) }) it('returns the correct text with newlines', () => { const text = new Text().text('Hello World\nHow is it\ngoing') expect(text.text()).toBe('Hello World\nHow is it\ngoing') }) it('returns the correct text with newlines and skips textPaths and descriptive elements', () => { const path = new Path() const text = new Text() const textPath = text.text('Hello World\nHow is it\ngoing').path(path) textPath.children().addTo(text) text.add(new TextPath(), 3) text.add(SVG('MyText')) expect(text.text()).toBe('Hello World\nHow is it\ngoing') }) it('executes passed block', () => { const text = new Text() text.text(function (t) { t.tspan('Hello World').newLine() t.tspan('How is it').newLine() t.tspan('going').newLine() expect(this).toBe(text) expect(t).toBe(text) }) expect(text.text()).toBe('Hello World\nHow is it\ngoing') }) it('triggers rebuild', () => { const text = new Text() const spy = spyOn(text, 'rebuild') text.text('foo') expect(spy).toHaveBeenCalled() }) }) describe('leading()', () => { it('returns the leading value of the text without an argument', () => { const text = new Text() expect(text.leading() instanceof SVGNumber) expect(text.leading().valueOf()).toBe(1.3) }) it('sets the leading value of the text with the first argument', () => { const text = new Text() expect(text.leading(1.5).dom.leading.valueOf()).toBe(1.5) }) }) describe('rebuild()', () => { it('disables the rebuild if called with false', () => { const text = new Text() expect(text.rebuild(false)._rebuild).toBeFalse() }) it('enables the rebuild if called with true', () => { const text = new Text() expect(text.rebuild(true)._rebuild).toBeTrue() }) it('rebuilds the text without an argument given', () => { const canvas = SVG().addTo(container) const text = new Text().addTo(canvas) text.text((t) => { t.tspan('Hello World').newLine() t.tspan('How is it').newLine() t.tspan('going').newLine() t.add('My Text') }) const dy = text.get(1).dy() text.leading(1.7) expect(dy).not.toBe(text.get(1).dy()) }) }) describe('setData()', () => { it('read all data from the svgjs:data attribute and assign it to el.dom', () => { const text = new Text() text.attr('svgjs:data', '{"foo":"bar","leading":"3px"}') text.setData(JSON.parse(text.attr('svgjs:data'))) expect(text.dom.foo).toBe('bar') expect(text.dom.leading instanceof SVGNumber).toBeTruthy() expect(text.dom.leading.value).toBe(3) expect(text.dom.leading.unit).toBe('px') }) it('uses a leading of 1.3 when no leading is set or 0', () => { const text = new Text() text.setData({ leading: 0 }) expect(text.dom.leading.value).toBe(1.3) }) }) describe('Container', () => { describe('text()', () => { it('creates a text element with lines', () => { const group = new G() const text = group.text('Hello World\nHow is it\ngoing') expect(text).toEqual(any(Text)) expect(text.text()).toBe('Hello World\nHow is it\ngoing') }) it('defaults to empty string', () => { const group = new G() const text = group.text() expect(text).toEqual(any(Text)) expect(text.text()).toBe('') }) }) describe('plain()', () => { it('creates plain text', () => { const group = new G() const text = group.plain('A piece') expect(text).toEqual(any(Text)) expect(text.node.childNodes[0].data).toBe('A piece') }) it('defaults to empty string', () => { const group = new G() const text = group.plain() expect(text).toEqual(any(Text)) expect(text.node.childNodes[0].data).toBe('') }) }) }) }) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������svg.js-3.2.4/spec/spec/elements/TextPath.js���������������������������������������������������������0000664�0000000�0000000�00000011314�14637234162�0020541�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* globals describe, expect, it, beforeEach, jasmine, container */ import { Text, SVG, TextPath, Path } from '../../../src/main.js' const { any } = jasmine describe('TextPath.js', () => { var canvas, text, path var txt = 'We go up, then we go down, then up again' var data = 'M 100 200 C 200 100 300 0 400 100 C 500 200 600 300 700 200 C 800 100 900 100 900 100' beforeEach(() => { canvas = new SVG().addTo(container) text = canvas.text(txt) path = canvas.path(data) }) describe('()', () => { it('creates a new object of type TextPath', () => { expect(new TextPath()).toEqual(any(TextPath)) }) it('sets passed attributes on the element', () => { expect(new TextPath({ id: 'foo' }).id()).toBe('foo') }) }) describe('track()', () => { it('returns the referenced path instance', () => { const textPath = text.path(path) expect(textPath.track()).toBe(path) }) }) describe('array()', () => { it('returns the path array of the underlying path', () => { expect(text.path(path).array()).toEqual(path.array()) }) it('returns null if there is no underlying path', () => { const textPath = new TextPath() expect(textPath.array()).toBe(null) }) }) describe('plot()', () => { it('changes the array of the underlying path', () => { expect(text.path().plot(path.array()).array()).toEqual(path.array()) }) it('return the path array of the underlying path when no arguments is passed', () => { const textPath = text.path(path) expect(textPath.plot()).toBe(textPath.array()) expect(textPath.plot()).not.toBe(null) }) it('does nothing if no path is attached as track', () => { const textPath = Object.freeze(new TextPath()) expect(textPath.plot('M0 0')).toBe(textPath) }) }) describe('Container', () => { describe('textPath()', () => { it('creates a textPath from string text and string path', () => { const textPath = canvas.textPath(txt, data) expect(textPath).toEqual(any(TextPath)) expect(textPath.parent()).toEqual(any(Text)) expect(textPath.track()).toEqual(any(Path)) expect(textPath.track().parent()).toBe(canvas.defs()) }) it('creates a textPath from Text and Path', () => { const textPath = canvas.textPath(text, path) expect(textPath.parent()).toEqual(text) expect(textPath.track()).toEqual(path) }) it('passes the text into textPath and not text', () => { const tspan = text.first() const textPath = canvas.textPath(text, path) expect(textPath.first()).toBe(tspan) expect(text.first()).toBe(textPath) }) }) }) describe('Text', () => { describe('path()', () => { it('returns an instance of TextPath', () => { expect(text.path(data)).toEqual(any(TextPath)) }) it('creates a textPath node in the text element', () => { text.path(data) expect(text.node.querySelector('textPath')).not.toBe(null) }) it('references the passed path', () => { const textPath = text.path(path) expect(textPath.reference('href')).toBe(path) }) it('imports all nodes from the text by default', () => { const children = text.children() const textPath = text.path(path) expect(textPath.children()).toEqual(children) }) it('does not import all nodes from the text when second parameter false', () => { const textPath = text.path(path, false) expect(textPath.children()).toEqual([]) }) }) describe('textPath()', () => { it('returns the textPath element of this text', () => { const textPath = text.path(path) expect(text.textPath()).toBe(textPath) }) }) }) describe('Path', () => { describe('text()', () => { it('returns an instance of TextPath', () => { expect(path.text(txt)).toEqual(any(TextPath)) }) it('creates a text with textPath node and inserts it after the path', () => { var textPath = path.text(txt) expect(textPath.parent()).toEqual(any(Text)) expect(SVG(path.node.nextSibling)).toBe(textPath.parent()) }) it('transplants the node from text to textPath', () => { const nodesInText = [].slice.call(text.node.childNodes) var textPath = path.text(text) const nodesInTextPath = [].slice.call(textPath.node.childNodes) expect(nodesInText).toEqual(nodesInTextPath) }) }) describe('targets', () => { it('returns all elements referencing this path with href', () => { const textPath = text.path(path) expect(path.targets()).toEqual([textPath]) }) }) }) }) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������svg.js-3.2.4/spec/spec/elements/Tspan.js������������������������������������������������������������0000664�0000000�0000000�00000007611�14637234162�0020072�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* globals describe, expect, it, jasmine, container */ import { Tspan, Text, Number as SVGNumber, SVG } from '../../../src/main.js' import { getWindow } from '../../../src/utils/window.js' const { any } = jasmine describe('Tspan.js', () => { describe('()', () => { it('creates a new object of type Tspan', () => { expect(new Tspan()).toEqual(any(Tspan)) }) it('sets passed attributes on the element', () => { expect(new Tspan({ id: 'foo' }).id()).toBe('foo') }) }) describe('text()', () => { it('sets the text content of the tspan and returns itself', () => { const tspan = new Tspan() expect(tspan.text('Hello World')).toBe(tspan) expect(tspan.node.textContent).toBe('Hello World') }) it('returns the textContent of the tspan', () => { const tspan = new Tspan().text('Hello World') expect(tspan.text()).toBe('Hello World') }) it('adds a newline when this tspan is a newline', () => { const tspan = new Tspan().text('Hello World').newLine() expect(tspan.text()).toBe('Hello World\n') }) it('executes a function in the context of the tspan', () => { const tspan = new Tspan() tspan.text(function (t) { expect(this).toBe(tspan) expect(t).toBe(tspan) }) }) }) describe('dx()', () => { it('sets the dx attribute and returns itself', () => { const tspan = new Tspan() expect(tspan.dx(20)).toBe(tspan) expect(tspan.attr('dx')).toBe(20) }) it('returns the dx attribute', () => { const tspan = new Tspan().dx(20) expect(tspan.dx()).toBe(20) }) }) describe('dy()', () => { it('sets the dy attribute and returns itself', () => { const tspan = new Tspan() expect(tspan.dy(20)).toBe(tspan) expect(tspan.attr('dy')).toBe(20) }) it('returns the dy attribute', () => { const tspan = new Tspan().dy(20) expect(tspan.dy()).toBe(20) }) }) describe('newLine()', () => { it('works without text parent', () => { // should not fail const tspan = new Tspan().newLine() expect(tspan.dom.newLined).toBeTrue() }) it('returns itself', () => { const tspan = new Tspan() expect(tspan.newLine()).toBe(tspan) }) it('marks the tspan as a newline', () => { const tspan = new Tspan().wrap(new Text()).newLine() expect(tspan.dom.newLined).toBeTrue() }) it('sets dy to zero of first line', () => { const text = new Text() const first = text.tspan('First Line').newLine() expect(first.dy()).toBe(0) }) it('sets dy corresponding to line and leading', () => { const canvas = SVG().addTo(container) const text = new Text().leading(2).build(true).addTo(canvas) text.tspan('First Line').newLine() text.tspan('Second Line').newLine() const third = text.tspan('Third Line').newLine() const fontSize = getWindow() .getComputedStyle(third.node) .getPropertyValue('font-size') const dy = 2 * new SVGNumber(fontSize) expect(third.dy()).toBe(dy) }) }) describe('Tspan', () => { describe('tspan()', () => { it('creates a tspan in a text', () => { const text = new Text() const tspan = text.tspan() expect(tspan).toEqual(any(Tspan)) expect(tspan.parent()).toBe(text) }) it('creates a tspan in a tspan', () => { const tspan1 = new Tspan() const tspan2 = tspan1.tspan() expect(tspan2).toEqual(any(Tspan)) expect(tspan2.parent()).toBe(tspan1) }) }) }) describe('Text', () => { describe('newLine()', () => { it('creates a tspan and calls newLine() on it', () => { const text = new Text() const tspan = text.newLine() expect(tspan).toEqual(any(Tspan)) expect(tspan.parent()).toBe(text) expect(tspan.dom.newLined).toBeTrue() }) }) }) }) �����������������������������������������������������������������������������������������������������������������������svg.js-3.2.4/spec/spec/elements/Use.js��������������������������������������������������������������0000664�0000000�0000000�00000002205�14637234162�0017533�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* globals describe, expect, it, jasmine, container */ import { Use, Rect, SVG } from '../../../src/main.js' const { any } = jasmine describe('Use.js', () => { describe('()', () => { it('creates a new object of type Use', () => { expect(new Use()).toEqual(any(Use)) }) it('sets passed attributes on the element', () => { expect(new Use({ id: 'foo' }).id()).toBe('foo') }) }) describe('use()', () => { it('links an element', () => { const rect = new Rect() const use = new Use().use(rect) expect(use.attr('href')).toBe('#' + rect.id()) }) it('links an element from a different file', () => { const use = new Use().use('id', 'file') expect(use.attr('href')).toBe('file#id') }) }) describe('Container', () => { describe('use()', () => { it('creates a use element linked to the given element', () => { const canvas = new SVG().addTo(container) const rect = canvas.rect(100, 100) const use = canvas.use(rect) expect(use.attr('href')).toBe('#' + rect.id()) expect(use.reference('href')).toBe(rect) }) }) }) }) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������svg.js-3.2.4/spec/spec/modules/���������������������������������������������������������������������0000775�0000000�0000000�00000000000�14637234162�0016276�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������svg.js-3.2.4/spec/spec/modules/core/����������������������������������������������������������������0000775�0000000�0000000�00000000000�14637234162�0017226�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������svg.js-3.2.4/spec/spec/modules/core/attr.js���������������������������������������������������������0000664�0000000�0000000�00000010314�14637234162�0020535�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* globals describe, expect, it, beforeEach, spyOn, jasmine */ import { Element, create, Text, Rect } from '../../../../src/main.js' import { registerAttrHook } from '../../../../src/modules/core/attr.js' const { objectContaining } = jasmine describe('attr.js', () => { describe('attr()', () => { let element beforeEach(() => { element = new Element(create('rect')) }) it('returns itself as setter', () => { expect(element.attr('fill', '#ff0066')).toBe(element) }) it('sets one attribute when two arguments are given', () => { element.attr('fill', '#ff0066') expect(element.node.getAttribute('fill')).toBe('#ff0066') }) it('sets various attributes when an object is given', () => { element.attr({ fill: '#00ff66', stroke: '#ff2233', 'stroke-width': 10 }) expect(element.node.getAttribute('fill')).toBe('#00ff66') expect(element.node.getAttribute('stroke')).toBe('#ff2233') expect(element.node.getAttribute('stroke-width')).toBe('10') }) it('gets the value of the string value given as first argument', () => { element.attr('fill', '#ff0066') expect(element.attr('fill')).toEqual('#ff0066') }) it('gets an object with all attributes without any arguments', () => { element.attr({ fill: '#00ff66', stroke: '#ff2233' }) var attr = element.attr() expect(attr.fill).toBe('#00ff66') expect(attr.stroke).toBe('#ff2233') }) it('removes an attribute if the second argument is explicitly set to null', () => { element.attr('stroke-width', 10) expect(element.node.getAttribute('stroke-width')).toBe('10') element.attr('stroke-width', null) expect(element.node.getAttribute('stroke-width')).toBe(null) }) it('correctly parses numeric values as a getter', () => { element.attr('stroke-width', 11) expect(element.node.getAttribute('stroke-width')).toBe('11') expect(element.attr('stroke-width')).toBe(11) }) it('correctly parses negative numeric values as a getter', () => { element.attr('x', -120) expect(element.node.getAttribute('x')).toBe('-120') expect(element.attr('x')).toBe(-120) }) it('falls back on default values if attribute is not present', () => { expect(element.attr('stroke-linejoin')).toBe('miter') }) it('gets the "style" attribute as a string', () => { element.css('cursor', 'pointer') expect(element.attr('style')).toBe('cursor: pointer;') }) it('sets the style attribute correctly', () => { element.attr('style', 'cursor:move;') expect(element.node.style.cursor).toBe('move') }) it('acts as getter for an array of values passed', () => { element.attr({ x: 1, y: 2, width: 20, 'fill-opacity': 0.5 }) const ret = element.attr(['x', 'fill-opacity']) expect(ret).toEqual({ x: 1, 'fill-opacity': 0.5 }) }) it('correctly creates SVG.Array if array given', () => { element.attr('something', [2, 3, 4]) expect(element.attr('something')).toBe('2 3 4') }) it('redirects to the leading() method when setting leading', () => { const text = new Text().text('Hello World') const spy = spyOn(text, 'leading') text.attr('leading', 2) expect(spy).toHaveBeenCalledWith(objectContaining({ value: 2 })) }) it('ignores leading if no leading method is available', () => { const frozen = Object.freeze(element) expect(frozen.attr('leading', 2)).toBe(frozen) }) it('only applies transforms color values if the attribute is designed to take a color as input', () => { const rect = new Rect().attr('id', '#ff0') expect(rect.attr('id')).toBe('#ff0') }) it('executes registered hooks', () => { registerAttrHook((attr, val, el) => { if (el.node.id === 'somethingVeryRandom' && attr === 'name') { throw new Error('This hook should only be executed in one test') } return val }) element.id('somethingVeryRandom') const throwingFn = () => { element.attr('name', 'Bob') } expect(throwingFn).toThrowError( 'This hook should only be executed in one test' ) }) }) }) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������svg.js-3.2.4/spec/spec/modules/core/circled.js������������������������������������������������������0000664�0000000�0000000�00000005261�14637234162�0021175�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* globals describe, expect, it, beforeEach, spyOn, jasmine, container */ import { Ellipse, SVG } from '../../../../src/main.js' const { objectContaining } = jasmine describe('circled.js', () => { let element beforeEach(() => { element = new Ellipse().size(50, 50) }) describe('rx()', () => { it('calls attribute with rx and returns itself', () => { const spy = spyOn(element, 'attr').and.callThrough() expect(element.rx(50)).toBe(element) expect(spy).toHaveBeenCalledWith('rx', 50) }) }) describe('ry()', () => { it('calls attribute with ry and returns itself', () => { const spy = spyOn(element, 'attr').and.callThrough() expect(element.ry(50)).toBe(element) expect(spy).toHaveBeenCalledWith('ry', 50) }) }) describe('x()', () => { it('sets x position and returns itself', () => { element = SVG().addTo(container).ellipse(50, 50) expect(element.x(50)).toBe(element) expect(element.bbox().x).toBe(50) }) it('gets the x position', () => { element.x(50) expect(element.x()).toBe(50) }) }) describe('y()', () => { it('sets y position and returns itself', () => { element = SVG().addTo(container).ellipse(50, 50) expect(element.y(50)).toBe(element) expect(element.bbox().y).toBe(50) }) it('gets the y position', () => { element.y(50) expect(element.y()).toBe(50) }) }) describe('cx()', () => { it('calls attribute with cx and returns itself', () => { const spy = spyOn(element, 'attr').and.callThrough() expect(element.cx(50)).toBe(element) expect(spy).toHaveBeenCalledWith('cx', 50) }) }) describe('cy()', () => { it('calls attribute with cy and returns itself', () => { const spy = spyOn(element, 'attr').and.callThrough() expect(element.cy(50)).toBe(element) expect(spy).toHaveBeenCalledWith('cy', 50) }) }) describe('width()', () => { it('sets rx by half the given width', () => { const spy = spyOn(element, 'rx').and.callThrough() expect(element.width(50)).toBe(element) expect(spy).toHaveBeenCalledWith(objectContaining({ value: 25 })) }) it('gets the width of the element', () => { element.width(100) expect(element.width()).toBe(100) }) }) describe('height()', () => { it('sets ry by half the given height', () => { const spy = spyOn(element, 'ry').and.callThrough() expect(element.height(50)).toBe(element) expect(spy).toHaveBeenCalledWith(objectContaining({ value: 25 })) }) it('gets the height of the element', () => { element.height(100) expect(element.height()).toBe(100) }) }) }) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������svg.js-3.2.4/spec/spec/modules/core/containerGeometry.js��������������������������������������������0000664�0000000�0000000�00000023624�14637234162�0023271�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* globals describe, expect, it, jasmine, spyOn, container */ import { Box, create, Element, G, Rect, SVG } from '../../../../src/main.js' const { any, objectContaining } = jasmine describe('containerGeometry.js', () => { describe('dmove()', () => { it('moves the bbox of the group by a certain amount (1)', () => { const canvas = SVG().addTo(container) const g = canvas.group() g.add(new Rect({ width: 100, height: 120, x: 10, y: 20 })) g.add(new Rect({ width: 70, height: 100, x: 50, y: 60 })) g.dmove(10, 10) const box = g.bbox() expect(box).toEqual( objectContaining({ x: 20, y: 30, width: box.width, height: box.height }) ) }) it('moves the bbox of the group by a certain amount (2)', () => { const canvas = SVG().addTo(container) const g = canvas.group() g.rect(400, 200).move(123, 312).rotate(34).skew(12) g.rect(100, 50).move(11, 43).translate(123, 32).skew(-12) g.rect(400, 200).rotate(90) g.group().rotate(23).group().skew(32).rect(100, 40).skew(11).rotate(12) const oldBox = g.bbox() g.dmove(10, 10) const newBox = g.bbox() expect(newBox.x).toBeCloseTo(oldBox.x + 10, 4) expect(newBox.y).toBeCloseTo(oldBox.y + 10, 4) expect(newBox.w).toBeCloseTo(oldBox.w, 4) expect(newBox.h).toBeCloseTo(oldBox.h, 4) }) it('moves nested svgs in a group correctly when calling dmove', () => { const canvas = SVG().addTo(container) const g = canvas.group() const s1 = g.nested().size(100, 100).move(100, 100) s1.rect(100, 100).move(50, 50).rotate(10) const oldBox = g.bbox() g.dmove(10, 10) const newBox = g.bbox() expect(newBox.x).toBeCloseTo(oldBox.x + 10, 4) expect(newBox.y).toBeCloseTo(oldBox.y + 10, 4) expect(newBox.w).toBeCloseTo(oldBox.w, 4) expect(newBox.h).toBeCloseTo(oldBox.h, 4) }) it('moves nested svgs in a group correctly when calling dmove (2)', () => { const canvas = SVG().addTo(container) const g = canvas.group() const s1 = g.nested().move(100, 100) s1.rect(100, 100).move(50, 50).rotate(10) const oldBox = g.bbox() g.dmove(10, 10) const newBox = g.bbox() expect(newBox.x).toBeCloseTo(oldBox.x + 10, 4) expect(newBox.y).toBeCloseTo(oldBox.y + 10, 4) expect(newBox.w).toBeCloseTo(oldBox.w, 4) expect(newBox.h).toBeCloseTo(oldBox.h, 4) }) it('moves nested svgs in a group correctly when calling dmove (3)', () => { const canvas = SVG().addTo(container) const g = canvas.group() const s1 = g.nested() s1.rect(100, 100).move(50, 50).rotate(10) const oldBox = g.bbox() g.dmove(10, 10) const newBox = g.bbox() expect(newBox.x).toBeCloseTo(oldBox.x + 10, 4) expect(newBox.y).toBeCloseTo(oldBox.y + 10, 4) expect(newBox.w).toBeCloseTo(oldBox.w, 4) expect(newBox.h).toBeCloseTo(oldBox.h, 4) }) it('it does not fail when hitting elements without bbox', () => { const canvas = SVG().addTo(container) const g = canvas.group() g.add(new Rect({ width: 100, height: 120, x: 10, y: 20 })) g.add(new Rect({ width: 70, height: 100, x: 50, y: 60 })) g.add(new Element(create('title'))) const fn = () => g.dmove(10, 10) expect(fn).not.toThrowError() const box = g.bbox() expect(box).toEqual( objectContaining({ x: 20, y: 30, width: box.width, height: box.height }) ) }) }) describe('dx()', () => { it('calls dmove with dy=0 and returns itself', () => { const canvas = SVG().addTo(container) const g = canvas.group() const spy = spyOn(g, 'dmove').and.callThrough() expect(g.dx(10)).toBe(g) expect(spy).toHaveBeenCalledWith(10, 0) }) }) describe('dy()', () => { it('calls dmove with dx=0 and returns itself', () => { const canvas = SVG().addTo(container) const g = canvas.group() const spy = spyOn(g, 'dmove').and.callThrough() expect(g.dy(10)).toBe(g) expect(spy).toHaveBeenCalledWith(0, 10) }) }) describe('move()', () => { it('calls dmove() with the correct difference', () => { const canvas = SVG().addTo(container) const g = canvas.group() g.rect(100, 200).move(111, 223) spyOn(g, 'dmove') g.move(100, 150) expect(g.dmove).toHaveBeenCalledWith(-11, -73) }) it('defaults to x=0 and y=0', () => { const canvas = SVG().addTo(container) const g = canvas.group() g.rect(100, 200).move(111, 223) spyOn(g, 'dmove') g.move() expect(g.dmove).toHaveBeenCalledWith(-111, -223) }) }) describe('x()', () => { it('gets the x value of the bbox', () => { const canvas = SVG().addTo(container) const g = new G() g.add(new Rect({ width: 100, height: 120, x: 10, y: 20 })) g.add(new Rect({ width: 70, height: 100, x: 50, y: 60 })) g.addTo(canvas) expect(g.x()).toBe(g.bbox().x) expect(g.x()).toBe(10) }) it('calls move with the parameter as x', () => { const canvas = SVG().addTo(container) const g = canvas.group() g.rect(100, 200).move(111, 223) spyOn(g, 'move') g.x(100) expect(g.move).toHaveBeenCalledWith(100, g.bbox().y, any(Box)) }) }) describe('y()', () => { it('gets the y value of the bbox', () => { const canvas = SVG().addTo(container) const g = new G() g.add(new Rect({ width: 100, height: 120, x: 10, y: 20 })) g.add(new Rect({ width: 70, height: 100, x: 50, y: 60 })) g.addTo(canvas) expect(g.y()).toBe(g.bbox().y) expect(g.y()).toBe(20) }) it('calls move with the parameter as y', () => { const canvas = SVG().addTo(container) const g = canvas.group() g.rect(100, 200).move(111, 223) spyOn(g, 'move') g.y(100) expect(g.move).toHaveBeenCalledWith(g.bbox().x, 100, any(Box)) }) }) describe('size()', () => { it('changes the dimensions of the bbox (1)', () => { const canvas = SVG().addTo(container) const g = new G() g.add(new Rect({ width: 100, height: 120, x: 10, y: 20 })) g.add(new Rect({ width: 70, height: 100, x: 50, y: 60 })) g.addTo(canvas) const oldBox = g.bbox() expect(g.size(100, 100)).toBe(g) const newBox = g.bbox() expect(newBox.x).toBeCloseTo(oldBox.x, 4) expect(newBox.y).toBeCloseTo(oldBox.y, 4) expect(newBox.w).toBeCloseTo(100, 4) expect(newBox.h).toBeCloseTo(100, 4) const rbox1 = g.children()[0].rbox() const rbox2 = g.children()[1].rbox() expect(rbox1.width).toBeCloseTo(90.9, 1) expect(Math.floor(rbox2.width * 10) / 10).toBeCloseTo(63.6, 1) // Browsers have different opinion on this one (chrome: 63.6, ff: 63.7) expect(rbox1.x).toBeCloseTo(10, 1) expect(rbox2.x).toBeCloseTo(46.4, 1) expect(rbox1.height).toBeCloseTo(85.7, 1) expect(rbox2.height).toBeCloseTo(71.4, 1) expect(rbox1.y).toBeCloseTo(20, 1) expect(rbox2.y).toBeCloseTo(48.6, 1) }) it('changes the dimensions of the bbox (2)', () => { const canvas = SVG().addTo(container) const g = canvas.group() g.rect(400, 200).move(123, 312).rotate(34).skew(12) g.rect(100, 50).move(11, 43).translate(123, 32).skew(-12) g.rect(400, 200).rotate(90) g.group().rotate(23).group().skew(32).rect(100, 40).skew(11).rotate(12) const oldBox = g.bbox() g.size(100, 100) const newBox = g.bbox() expect(newBox.x).toBeCloseTo(oldBox.x, 4) expect(newBox.y).toBeCloseTo(oldBox.y, 4) expect(newBox.w).toBeCloseTo(100, 4) expect(newBox.h).toBeCloseTo(100, 4) }) }) describe('width()', () => { it('gets the width value of the bbox', () => { const canvas = SVG().addTo(container) const g = new G() g.add(new Rect({ width: 100, height: 120, x: 10, y: 20 })) g.add(new Rect({ width: 70, height: 100, x: 50, y: 60 })) g.addTo(canvas) expect(g.width()).toBe(g.bbox().width) expect(g.width()).toBe(110) }) it('sets the width value of the bbox by moving all children', () => { const canvas = SVG().addTo(container) const g = new G() g.add(new Rect({ width: 100, height: 120, x: 10, y: 20 })) g.add(new Rect({ width: 70, height: 100, x: 50, y: 60 })) g.addTo(canvas) expect(g.width(100)).toBe(g) expect(g.bbox().width).toBe(100) const rbox1 = g.children()[0].rbox() const rbox2 = g.children()[1].rbox() expect(rbox1.width).toBeCloseTo(90.9, 1) expect(Math.floor(rbox2.width * 10) / 10).toBeCloseTo(63.6, 1) // Browsers have different opinion on this one (chrome: 63.6, ff: 63.7) expect(rbox1.x).toBeCloseTo(10, 3) expect(rbox2.x).toBeCloseTo(46.4, 1) }) }) describe('height()', () => { it('gets the height value of the bbox', () => { const canvas = SVG().addTo(container) const g = new G() g.add(new Rect({ width: 100, height: 120, x: 10, y: 20 })) g.add(new Rect({ width: 70, height: 100, x: 50, y: 60 })) g.addTo(canvas) expect(g.height()).toBe(g.bbox().height) expect(g.height()).toBe(140) }) it('sets the height value of the bbox by moving all children', () => { const canvas = SVG().addTo(container) const g = new G() g.add(new Rect({ width: 100, height: 120, x: 10, y: 20 })) g.add(new Rect({ width: 70, height: 100, x: 50, y: 60 })) g.addTo(canvas) expect(g.height(100)).toBe(g) expect(g.bbox().height).toBeCloseTo(100, 3) const rbox1 = g.children()[0].rbox() const rbox2 = g.children()[1].rbox() expect(rbox1.height).toBeCloseTo(85.7, 1) expect(rbox2.height).toBeCloseTo(71.4, 1) expect(rbox1.y).toBeCloseTo(20, 3) expect(rbox2.y).toBeCloseTo(48.6, 1) }) }) }) ������������������������������������������������������������������������������������������������������������svg.js-3.2.4/spec/spec/modules/core/event.js��������������������������������������������������������0000664�0000000�0000000�00000017171�14637234162�0020714�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* globals describe, expect, it, spyOn, jasmine */ import { windowEvents, getEvents, getEventTarget, clearEvents, dispatch, on, off } from '../../../../src/modules/core/event.js' import { getWindow } from '../../../../src/utils/window.js' import { EventTarget, SVG } from '../../../../src/main.js' const { any, createSpy } = jasmine describe('event.js', () => { describe('getEvents()', () => { it('returns the instance events for an EventTarget', () => { const eventTarget = new EventTarget() eventTarget.events = 'Test' const events = getEvents(eventTarget) expect(events).toBe('Test') }) it('accesses windowEvents if instance is window', () => { windowEvents.events = 'bla' const events = getEvents(SVG(getWindow())) expect(events).toBe(windowEvents.events) }) }) describe('getEventTarget()', () => { it('calls getEventTarget() on the instance', () => { const eventTarget = new EventTarget() const spy = spyOn(eventTarget, 'getEventTarget') getEventTarget(eventTarget) expect(spy).toHaveBeenCalled() }) }) describe('clearEvents()', () => { it('sets events to an empty object', () => { const eventTarget = new EventTarget() eventTarget.events = 'Test' clearEvents(eventTarget) expect(eventTarget.events).toEqual({}) }) it('does not do anything if no event object is found on the instance', () => { const eventTarget = new EventTarget() delete eventTarget.events clearEvents(eventTarget) expect(eventTarget.events).toBe(undefined) }) }) describe('on()', () => { it('binds an event to an EventTarget', () => { const eventTarget = new EventTarget() const spy = createSpy('spy') on(eventTarget, 'event', spy) dispatch(eventTarget, 'event') expect(spy).toHaveBeenCalledWith(any(getWindow().CustomEvent)) }) it('binds to multiple events with space or comma separated string', () => { const eventTarget = new EventTarget() const spy = createSpy('spy') on(eventTarget, 'event1 event2, event3', spy) dispatch(eventTarget, 'event1') dispatch(eventTarget, 'event2') dispatch(eventTarget, 'event3') expect(spy).toHaveBeenCalledTimes(3) }) it('binds to multiple events passed as array', () => { const eventTarget = new EventTarget() const spy = createSpy('spy') on(eventTarget, ['event1', 'event2', 'event3'], spy) dispatch(eventTarget, 'event1') dispatch(eventTarget, 'event2') dispatch(eventTarget, 'event3') expect(spy).toHaveBeenCalledTimes(3) }) it('binds a namespaced event of form event.namespace', () => { const eventTarget = new EventTarget() const spy = createSpy('spy') on(eventTarget, 'event.namespace', spy) dispatch(eventTarget, 'event') expect(spy).toHaveBeenCalledWith(any(getWindow().CustomEvent)) }) }) describe('off()', () => { it('unbinds an event of an EventTarget', () => { const eventTarget = new EventTarget() const spy = createSpy('spy') on(eventTarget, 'event', spy) dispatch(eventTarget, 'event') off(eventTarget, 'event', spy) dispatch(eventTarget, 'event') expect(spy).toHaveBeenCalledTimes(1) }) it('unbinds multiple events with space or comma separated string', () => { const eventTarget = new EventTarget() const spy = createSpy('spy') on(eventTarget, 'event1 event2, event3', spy) dispatch(eventTarget, 'event1') dispatch(eventTarget, 'event2') dispatch(eventTarget, 'event3') off(eventTarget, 'event1 event2, event3', spy) dispatch(eventTarget, 'event1') dispatch(eventTarget, 'event2') dispatch(eventTarget, 'event3') expect(spy).toHaveBeenCalledTimes(3) }) it('unbinds multiple events with space or comma separated string', () => { const eventTarget = new EventTarget() const spy = createSpy('spy') on(eventTarget, ['event1', 'event2', 'event3'], spy) dispatch(eventTarget, 'event1') dispatch(eventTarget, 'event2') dispatch(eventTarget, 'event3') off(eventTarget, ['event1', 'event2', 'event3'], spy) dispatch(eventTarget, 'event1') dispatch(eventTarget, 'event2') dispatch(eventTarget, 'event3') expect(spy).toHaveBeenCalledTimes(3) }) it('unbinds a namespaced event', () => { const eventTarget = new EventTarget() const spy = createSpy('spy') on(eventTarget, 'event.namespace', spy) dispatch(eventTarget, 'event') off(eventTarget, 'event.namespace', spy) dispatch(eventTarget, 'event') expect(spy).toHaveBeenCalledTimes(1) }) it('unbinds all events including namespaced ones when only event is passed', () => { const eventTarget = new EventTarget() const spy = createSpy('spy') on(eventTarget, ['event1.ns1', 'event2.ns2', 'event3'], spy) dispatch(eventTarget, 'event1') dispatch(eventTarget, 'event2') dispatch(eventTarget, 'event3') off(eventTarget, ['event1', 'event2', 'event3']) dispatch(eventTarget, 'event1') dispatch(eventTarget, 'event2') dispatch(eventTarget, 'event3') expect(spy).toHaveBeenCalledTimes(3) }) it('unbinds with namespace only', () => { const eventTarget = new EventTarget() const spy1 = createSpy('spy1') const spy2 = createSpy('spy2') const spy3 = createSpy('spy3') on(eventTarget, 'event1.ns1', spy1) on(eventTarget, 'event2.ns1', spy2) on(eventTarget, 'event3.ns2', spy3) dispatch(eventTarget, 'event1') dispatch(eventTarget, 'event2') dispatch(eventTarget, 'event3') off(eventTarget, '.ns1') dispatch(eventTarget, 'event1') dispatch(eventTarget, 'event2') dispatch(eventTarget, 'event3') expect(spy1).toHaveBeenCalledTimes(1) expect(spy2).toHaveBeenCalledTimes(1) expect(spy3).toHaveBeenCalledTimes(2) }) it('unbinds all events when called without event', () => { const eventTarget = new EventTarget() const spy1 = createSpy('spy1') const spy2 = createSpy('spy2') const spy3 = createSpy('spy3') on(eventTarget, 'event1.ns1', spy1) on(eventTarget, 'event2.ns1', spy2) on(eventTarget, 'event3.ns2', spy3) dispatch(eventTarget, 'event1') dispatch(eventTarget, 'event2') dispatch(eventTarget, 'event3') off(eventTarget) dispatch(eventTarget, 'event1') dispatch(eventTarget, 'event2') dispatch(eventTarget, 'event3') expect(spy1).toHaveBeenCalledTimes(1) expect(spy2).toHaveBeenCalledTimes(1) expect(spy3).toHaveBeenCalledTimes(1) }) }) describe('dispatch()', () => { it('dispatches a custom event on the EventTarget by calling dispatchEvent()', () => { const eventTarget = new EventTarget() const spy = spyOn(eventTarget, 'dispatchEvent') const event = dispatch( eventTarget, 'event', { some: 'data' }, { cancelable: false } ) expect(event).toEqual(any(getWindow().CustomEvent)) expect(spy).toHaveBeenCalledWith(event) expect(event.detail).toEqual({ some: 'data' }) expect(event.cancelable).toBe(false) }) it('dispatches the passed event directly', () => { const eventTarget = new EventTarget() const spy = spyOn(eventTarget, 'dispatchEvent') const CustomEvent = getWindow().CustomEvent const event1 = new CustomEvent('event', { detail: { some: 'data' } }) const event2 = dispatch(eventTarget, event1) expect(event1).toBe(event2) expect(spy).toHaveBeenCalledWith(event1) }) }) }) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������svg.js-3.2.4/spec/spec/modules/core/gradiented.js���������������������������������������������������0000664�0000000�0000000�00000002332�14637234162�0021672�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* globals describe, expect, it */ import { Gradient } from '../../../../src/main.js' describe('gradiented.js', () => { describe('from()', () => { it('sets fx and fy for radial gradients and returns itself', () => { const gradient = new Gradient('radial') expect(gradient.from(10, 20)).toBe(gradient) expect(gradient.attr('fx')).toBe(10) expect(gradient.attr('fy')).toBe(20) }) it('sets x1 and y1 for linear gradients and returns itself', () => { const gradient = new Gradient('linear') expect(gradient.from(10, 20)).toBe(gradient) expect(gradient.attr('x1')).toBe(10) expect(gradient.attr('y1')).toBe(20) }) }) describe('to()', () => { it('sets cx and cy for radial gradients and returns itself', () => { const gradient = new Gradient('radial') expect(gradient.to(10, 20)).toBe(gradient) expect(gradient.attr('cx')).toBe(10) expect(gradient.attr('cy')).toBe(20) }) it('sets x2 and y2 for linear gradients and returns itself', () => { const gradient = new Gradient('linear') expect(gradient.to(10, 20)).toBe(gradient) expect(gradient.attr('x2')).toBe(10) expect(gradient.attr('y2')).toBe(20) }) }) }) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������svg.js-3.2.4/spec/spec/modules/core/parser.js�������������������������������������������������������0000664�0000000�0000000�00000001534�14637234162�0021063�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* globals describe, expect, it */ import parser from '../../../../src/modules/core/parser.js' import { getWindow } from '../../../../src/utils/window.js' describe('parser.js', () => { describe('parser()', () => { it('returns an object with svg and path', () => { const nodes = parser() expect(nodes.path).toBeDefined() expect(nodes.svg).toBeDefined() }) it('creates an svg node in the dom', () => { expect(getWindow().document.querySelector('svg')).toBe(null) const nodes = parser() expect(getWindow().document.querySelector('svg')).toBe(nodes.svg.node) }) it('reuses parser instance when it was removed', () => { const nodes = parser() nodes.svg.remove() const nodes2 = parser() expect(nodes.svg).toBe(nodes2.svg) expect(nodes.path).toBe(nodes2.path) }) }) }) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������svg.js-3.2.4/spec/spec/modules/core/pointed.js������������������������������������������������������0000664�0000000�0000000�00000003467�14637234162�0021240�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* globals describe, expect, it, beforeEach, container */ import { SVG } from '../../../../src/main.js' describe('pointed.js', () => { let canvas, lines beforeEach(() => { canvas = SVG().addTo(container) const line = canvas.line(1, 2, 3, 4) const polygon = canvas.polygon([1, 2, 3, 4]) const polyline = canvas.polyline([1, 2, 3, 4]) lines = { line, polygon, polyline } }) ;['line', 'polygon', 'polyline'].forEach((l) => { describe('for ' + l, () => { describe('x()', () => { it('sets the x value of the ' + l + 'and returns itself', () => { expect(lines[l].x(50)).toBe(lines[l]) expect(lines[l].bbox().x).toBe(50) }) it('gets the x value of the ' + l, () => { expect(lines[l].x(50).x()).toBe(50) }) }) describe('y()', () => { it('sets the y value of the ' + l + 'and returns itself', () => { expect(lines[l].y(50)).toBe(lines[l]) expect(lines[l].bbox().y).toBe(50) }) it('gets the y value of the ' + l, () => { expect(lines[l].y(50).y()).toBe(50) }) }) describe('width()', () => { it('sets the width of the ' + l + 'and returns itself', () => { expect(lines[l].width(50)).toBe(lines[l]) expect(lines[l].bbox().width).toBe(50) }) it('gets the width of the ' + l, () => { expect(lines[l].width(50).width()).toBe(50) }) }) describe('height()', () => { it('sets the height of the ' + l + 'and returns itself', () => { expect(lines[l].height(50)).toBe(lines[l]) expect(lines[l].bbox().height).toBe(50) }) it('gets the height of the ' + l, () => { expect(lines[l].height(50).height()).toBe(50) }) }) }) }) }) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������svg.js-3.2.4/spec/spec/modules/core/poly.js���������������������������������������������������������0000664�0000000�0000000�00000006512�14637234162�0020553�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* globals describe, expect, beforeEach, it, spyOn, jasmine, container */ import { Polygon, SVG, PointArray } from '../../../../src/main.js' const { any, objectContaining } = jasmine describe('Polygon.js', () => { let poly beforeEach(() => { poly = new Polygon() }) describe('array()', () => { it('returns the underlying PointArray', () => { const array = poly.plot('1 2 3 4').array() expect(array).toEqual(any(PointArray)) expect(array).toEqual([ [1, 2], [3, 4] ]) }) }) describe('clear()', () => { it('clears the array cache and returns itself', () => { const array = poly.plot('1 2 3 4').array() expect(poly.clear()).toBe(poly) expect(array).not.toBe(poly._array) }) }) describe('move()', () => { it('returns itself', () => { expect(poly.move(0, 0)).toBe(poly) }) it('moves the poly along x and y axis', () => { const canvas = SVG().addTo(container) const poly = canvas.polygon('0 0 50 50') poly.move(50, 50) expect(poly.bbox()).toEqual( objectContaining({ x: 50, y: 50, width: 50, height: 50 }) ) }) }) describe('plot()', () => { it('relays to array() as getter', () => { const spy = spyOn(poly, 'array') poly.plot() expect(spy).toHaveBeenCalled() }) it('works by passing a string', () => { const spy = spyOn(poly, 'attr') poly.plot('1 2 3 4') expect(spy).toHaveBeenCalledWith('points', '1 2 3 4') }) it('works with flat array', () => { const spy = spyOn(poly, 'attr') poly.plot([1, 2, 3, 4]) expect(spy).toHaveBeenCalledWith('points', [ [1, 2], [3, 4] ]) }) it('works with multi array', () => { const spy = spyOn(poly, 'attr') poly.plot([ [1, 2], [3, 4] ]) expect(spy).toHaveBeenCalledWith('points', [ [1, 2], [3, 4] ]) }) it('works with PointArray', () => { const spy = spyOn(poly, 'attr') poly.plot( new PointArray([ [1, 2], [3, 4] ]) ) expect(spy).toHaveBeenCalledWith('points', [ [1, 2], [3, 4] ]) }) }) describe('size()', () => { it('returns itself', () => { expect(poly.size(50, 50)).toBe(poly) }) it('sets the size of the poly', () => { const canvas = SVG().addTo(container) const poly = canvas.polygon('0 0 50 50') poly.size(100, 100) expect(poly.bbox()).toEqual( objectContaining({ width: 100, height: 100, x: 0, y: 0 }) ) }) it('changes height proportionally', () => { const canvas = SVG().addTo(container) const poly = canvas.polygon('0 0 50 50') poly.size(100, null) expect(poly.bbox()).toEqual( objectContaining({ width: 100, height: 100, x: 0, y: 0 }) ) }) it('changes width proportionally', () => { const canvas = SVG().addTo(container) const poly = canvas.polygon('0 0 50 50') poly.size(null, 100) expect(poly.bbox()).toEqual( objectContaining({ width: 100, height: 100, x: 0, y: 0 }) ) }) }) }) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������svg.js-3.2.4/spec/spec/modules/core/regex.js��������������������������������������������������������0000664�0000000�0000000�00000016341�14637234162�0020703�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* globals describe, expect, it */ import { regex } from '../../../../src/main.js' describe('regex.js', () => { describe('numberAndUnit', () => { it('matches number and unit 12px', () => { const match = '12px'.match(regex.numberAndUnit) expect(match[1]).toBe('12') expect(match[5]).toBe('px') }) it('matches number and unit 12', () => { const match = '12'.match(regex.numberAndUnit) expect(match[1]).toBe('12') expect(match[5]).toBe('') }) it('matches number and unit 12%', () => { const match = '12%'.match(regex.numberAndUnit) expect(match[1]).toBe('12') expect(match[5]).toBe('%') }) it('matches number and unit -12%', () => { const match = '-12%'.match(regex.numberAndUnit) expect(match[1]).toBe('-12') expect(match[5]).toBe('%') }) it('matches number and unit -12.123%', () => { const match = '-12.123%'.match(regex.numberAndUnit) expect(match[1]).toBe('-12.123') expect(match[5]).toBe('%') }) it('matches number and unit -12.123e12%', () => { const match = '-12.123e12%'.match(regex.numberAndUnit) expect(match[1]).toBe('-12.123e12') expect(match[5]).toBe('%') }) }) describe('hex', () => { it('matches a 6 digit hex', () => { const match = '#123456'.match(regex.hex) expect(match[1]).toBe('12') expect(match[2]).toBe('34') expect(match[3]).toBe('56') }) /* it('does not matches without #', () => { const match = '123456'.match(regex.hex) expect(match).toBe(null) }) */ it('does not matches other then 0-f #', () => { const match = '#09afhz'.match(regex.hex) expect(match).toBe(null) }) it('does not matches non full hex', () => { const match = '#aaa'.match(regex.hex) expect(match).toBe(null) }) }) describe('rgb', () => { it('matches rgb values of rgb(...) command', () => { const match = 'rgb(12,34,56)'.match(regex.rgb) expect(match[1]).toBe('12') expect(match[2]).toBe('34') expect(match[3]).toBe('56') }) it('does not match in the wrong format', () => { expect('rgb( 12 , 34 , 56)'.match(regex.rgb)).toBe(null) expect('12,34,56'.match(regex.rgb)).toBe(null) expect('(12,34,56)'.match(regex.rgb)).toBe(null) expect('rgb(aa,34,56)'.match(regex.rgb)).toBe(null) expect('rgb(12,34)'.match(regex.rgb)).toBe(null) }) }) describe('reference', () => { it('matches a reference', () => { const match = '#soMe_cRazy-1_id'.match(regex.reference) expect(match[1]).toBe('#soMe_cRazy-1_id') }) it('tries to match malformed references', () => { const match = '#some_crazy%-1_id'.match(regex.reference) expect(match[0]).toBe('#some_crazy') }) }) describe('transforms', () => { it('splits a transform chain', () => { const split = 'rotate(34) translate(1,2), translate(1 , 3),rotate(12) , something(1,2,3)'.split( regex.transforms ) expect(split).toEqual([ 'rotate(34', 'translate(1,2', 'translate(1 , 3', 'rotate(12', 'something(1,2,3', '' ]) }) }) describe('whitespace', () => { it('replaces all whitespaces', () => { expect(' \n \r \t '.replace(regex.whitespace, ' ')).toBe( ' ' ) }) }) describe('isHex', () => { it('returns true when testing hex values', () => { expect(regex.isHex.test('#123')).toBe(true) expect(regex.isHex.test('#abc')).toBe(true) expect(regex.isHex.test('#123456')).toBe(true) expect(regex.isHex.test('#abcdef')).toBe(true) expect(regex.isHex.test('#16fde9')).toBe(true) }) it('returns false when testing non hex values', () => { expect(regex.isHex.test('#12')).toBe(false) expect(regex.isHex.test('abc')).toBe(false) expect(regex.isHex.test('#1234563')).toBe(false) expect(regex.isHex.test('#kasdhs')).toBe(false) expect(regex.isHex.test('#abcd')).toBe(false) }) }) describe('isRgb', () => { it('returns true when testing rgb values', () => { expect(regex.isRgb.test('rgb(1,2,3)')).toBe(true) expect(regex.isRgb.test('rgb( 3, 1,3)')).toBe(true) }) it('returns false when testing non rgb values', () => { expect(regex.isRgb.test('hsl(1,2,3)')).toBe(false) expect(regex.isRgb.test('#123')).toBe(false) expect(regex.isRgb.test('something')).toBe(false) }) }) describe('isBlank', () => { it('returns true if something is blank', () => { expect(regex.isBlank.test('')).toBe(true) expect(regex.isBlank.test(' ')).toBe(true) expect(regex.isBlank.test('\n')).toBe(true) expect(regex.isBlank.test('\r')).toBe(true) expect(regex.isBlank.test('\t')).toBe(true) expect(regex.isBlank.test(' \n\r\t')).toBe(true) }) it('returns false if something is not blank', () => { expect(regex.isBlank.test('a')).toBe(false) expect(regex.isBlank.test('1')).toBe(false) }) }) describe('isNumber', () => { it('returns true if something is a number', () => { expect(regex.isNumber.test('123')).toBe(true) expect(regex.isNumber.test('-123')).toBe(true) expect(regex.isNumber.test('-12.3')).toBe(true) expect(regex.isNumber.test('-12.3e12')).toBe(true) expect(regex.isNumber.test('-12.3e-12')).toBe(true) expect(regex.isNumber.test('+12.3e-12')).toBe(true) expect(regex.isNumber.test('+12.3E-12')).toBe(true) }) it('returns false if something is not a number', () => { expect(regex.isNumber.test('a')).toBe(false) expect(regex.isNumber.test('-a')).toBe(false) expect(regex.isNumber.test('-12a')).toBe(false) expect(regex.isNumber.test('-12.3a12')).toBe(false) expect(regex.isNumber.test('-12.3e-1a')).toBe(false) expect(regex.isNumber.test('12.12.12')).toBe(false) expect(regex.isNumber.test('12.12e12.3')).toBe(false) expect(regex.isNumber.test('12.12e12e4')).toBe(false) }) }) describe('isImage', () => { it('returns true if something is an image filename', () => { expect(regex.isImage.test('a.jpg')).toBe(true) expect(regex.isImage.test('a.jpeg')).toBe(true) expect(regex.isImage.test('a.png')).toBe(true) expect(regex.isImage.test('a.gif')).toBe(true) expect(regex.isImage.test('a.svg')).toBe(true) }) it('returns false if something is not an image filename', () => { expect(regex.isImage.test('a.abc')).toBe(false) expect(regex.isImage.test('a.txt')).toBe(false) expect(regex.isImage.test('a.doc')).toBe(false) }) }) describe('delimiter', () => { it('splits at whitespace and comma', () => { const split = '1,2 3 , 4 5,, 6'.split(regex.delimiter) expect(split).toEqual(['1', '2', '3', '4', '5', '6']) }) }) describe('isPathLetter', () => { it('returns true if something is a path letter', () => { 'MLHVCSQTAZmlhvcsqtaz'.split('').forEach((l) => { expect(regex.isPathLetter.test(l)).toBe(true) }) }) it('returns false if something is not path letter', () => { '123biuBIU$%&'.split('').forEach((l) => { expect(regex.isPathLetter.test(l)).toBe(false) }) }) }) }) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������svg.js-3.2.4/spec/spec/modules/core/selector.js�����������������������������������������������������0000664�0000000�0000000�00000004076�14637234162�0021413�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* globals describe, expect, it, container */ import { find, SVG, G } from '../../../../src/main.js' import { getWindow } from '../../../../src/utils/window.js' describe('selector.js', () => { describe('baseFind()', () => { it('finds all elements of a selector in the document', () => { const div = SVG('
', true).id('foo').addTo(container) const span = SVG('', true).addClass('bar').addTo(div) const span2 = SVG('', true).addTo(div) expect(find('#canvas').map((el) => el.node)).toEqual([container]) expect(find('span')).toEqual([span, span2]) expect(find('#foo')).toEqual([div]) expect(find('.bar')).toEqual([span]) }) it('finds all elements of a selector scoped to an element', () => { const div = SVG('
', true).id('foo').addTo(container) expect(find('#canvas', getWindow().document)[0].node).toBe(container) expect(find('#foo', container)).toEqual([div]) expect(find('#canvas', div.node)).toEqual([]) }) }) describe('Dom', () => { describe('find()', () => { it('finds all elements matching the selector in this element', () => { const g1 = new G() const g2 = new G().addTo(g1).id('foo') const g3 = new G().addTo(g1).addClass('bar') const g4 = new G().addTo(g2) const g5 = new G().addTo(g3) expect(g1.find('g')).toEqual([g2, g4, g3, g5]) expect(g2.find('g')).toEqual([g4]) expect(g1.find('#foo')).toEqual([g2]) expect(g2.find('#foo')).toEqual([]) expect(g1.find('.bar')).toEqual([g3]) }) }) describe('findOne()', () => { it('finds an element in this element', () => { const g1 = new G() const g2 = new G().addTo(g1).id('foo') const g3 = new G().addTo(g1).addClass('bar') const g4 = new G().addTo(g2) expect(g1.findOne('g')).toBe(g2) expect(g2.findOne('g')).toBe(g4) expect(g1.findOne('#foo')).toBe(g2) expect(g2.findOne('#foo')).toBe(null) expect(g1.findOne('.bar')).toBe(g3) }) }) }) }) svg.js-3.2.4/spec/spec/modules/core/textable.js000066400000000000000000000264471463723416200214110ustar00rootroot00000000000000/* globals describe, expect, it, beforeEach, spyOn, container */ import { SVG, Box, Tspan } from '../../../../src/main.js' describe('textable.js', () => { var canvas, text, tspan beforeEach(() => { canvas = SVG().addTo(container) text = canvas.text('Hello World\nIn two lines') tspan = text.get(0) }) describe('x()', () => { it('returns the value of x without an argument on a text', () => { expect(text.x(0).x()).toBe(0) }) it('sets the x value of the bbox with the first argument on a text', () => { text.x(123) expect(text.bbox().x).toBe(123) }) it('sets the value of all lines', () => { text.x(200) text.each(function () { expect(this.x()).toBe(text.x()) }) }) it('returns the value of x without an argument on a tspan', () => { expect(tspan.x(10).x()).toBe(10) }) it('sets the x value of the bbox with the first argument on a tspan', () => { tspan.x(123) expect(tspan.bbox().x).toBe(123) }) }) describe('y()', () => { it('returns the value of y without an argument on a text', () => { expect(text.y(0).y()).toBe(0) }) it('sets the y value of the bbox with the first argument on a text', () => { text.y(123) expect(text.bbox().y).toBe(123) }) it('sets the y position of first line', () => { text.y(200) expect(text.first().y()).toBe(text.y()) }) it('returns the value of y without an argument on a tspan', () => { expect(tspan.y(10).y()).toBe(10) }) it('sets the y value of the bbox with the first argument on a tspan', () => { tspan.y(123) expect(tspan.bbox().y).toBe(123) }) }) describe('move()', () => { it('calls x() and y() with parameters on text', () => { const spyX = spyOn(text, 'x').and.callThrough() const spyY = spyOn(text, 'y').and.callThrough() const box = new Box() text.move(1, 2, box) expect(spyX).toHaveBeenCalledWith(1, box) expect(spyY).toHaveBeenCalledWith(2, box) }) it('calls x() and y() with parameters on tspan', () => { const spyX = spyOn(tspan, 'x').and.callThrough() const spyY = spyOn(tspan, 'y').and.callThrough() const box = new Box() tspan.move(1, 2, box) expect(spyX).toHaveBeenCalledWith(1, box) expect(spyY).toHaveBeenCalledWith(2, box) }) }) describe('ax()', () => { it('sets the value of x with a percent value with Text', () => { text.ax('40%') expect(text.node.getAttribute('x')).toBe('40%') }) it('returns the value of x when x is a percentual value with Text', () => { expect(text.ax('40%').ax()).toBe('40%') }) it('sets the value of x with a percent value with Tspan', () => { tspan.ax('40%') expect(tspan.node.getAttribute('x')).toBe('40%') }) it('returns the value of x when x is a percentual value with Tspan', () => { tspan.ax('40%') expect(tspan.ax()).toBe('40%') }) }) describe('ay()', () => { it('sets the value of y with a percent value with Text', () => { text.ay('40%') expect(text.node.getAttribute('y')).toBe('40%') }) it('returns the value of y when y is a percentual value with Tspan', () => { expect(text.ay('45%').ay()).toBe('45%') }) it('sets the value of y with a percent value with Text', () => { tspan.ay('40%') expect(tspan.node.getAttribute('y')).toBe('40%') }) it('returns the value of y when y is a percentual value with Tspan', () => { tspan.ay('40%') expect(tspan.ay()).toBe('40%') }) }) describe('move()', () => { it('calls ax() and ay() with parameters on text', () => { const spyX = spyOn(text, 'ax').and.callThrough() const spyY = spyOn(text, 'ay').and.callThrough() text.amove(1, 2) expect(spyX).toHaveBeenCalledWith(1) expect(spyY).toHaveBeenCalledWith(2) }) it('calls ax() and ay() with parameters on tspan', () => { const spyX = spyOn(tspan, 'ax').and.callThrough() const spyY = spyOn(tspan, 'ay').and.callThrough() tspan.amove(1, 2) expect(spyX).toHaveBeenCalledWith(1) expect(spyY).toHaveBeenCalledWith(2) }) }) // this is a hackish. It should not be neccessary to use toBeCloseTo but bbox with text is a thing... describe('cx()', () => { it('returns the value of cx without an argument with Text', () => { var box = text.bbox() expect(text.cx()).toBeCloseTo(box.x + box.width / 2) }) it('sets the value of cx with the first argument with Text', () => { text.cx(123) var box = text.bbox() expect(box.cx).toBeCloseTo(box.x + box.width / 2) }) it('returns the value of cx without an argument with Tspan', () => { var box = tspan.bbox() expect(tspan.cx()).toBeCloseTo(box.x + box.width / 2) }) it('sets the value of cx with the first argument with Tspan', () => { tspan.cx(123) var box = tspan.bbox() expect(box.cx).toBeCloseTo(box.x + box.width / 2) }) }) describe('cy()', () => { it('returns the value of cy without an argument with Tspan', () => { var box = tspan.bbox() expect(tspan.cy()).toBe(box.cy) }) it('sets the value of cy with the first argument with Tspan', () => { tspan.cy(345) var box = tspan.bbox() expect(Math.round(box.cy * 10) / 10).toBe(345) }) it('returns the value of cy without an argument with Tspan', () => { var box = tspan.bbox() expect(tspan.cy()).toBe(box.cy) }) it('sets the value of cy with the first argument with Tspan', () => { tspan.cy(345) var box = tspan.bbox() expect(Math.round(box.cy * 10) / 10).toBe(345) }) }) describe('center()', () => { it('calls cx() and cy() with parameters on Text', () => { const spyX = spyOn(text, 'cx').and.callThrough() const spyY = spyOn(text, 'cy').and.callThrough() const box = new Box() text.center(1, 2, box) expect(spyX).toHaveBeenCalledWith(1, box) expect(spyY).toHaveBeenCalledWith(2, box) }) it('calls cx() and cy() with parameters on Tspan', () => { const spyX = spyOn(tspan, 'cx').and.callThrough() const spyY = spyOn(tspan, 'cy').and.callThrough() const box = new Box() tspan.center(1, 2, box) expect(spyX).toHaveBeenCalledWith(1, box) expect(spyY).toHaveBeenCalledWith(2, box) }) }) describe('plain()', () => { it('adds content without a tspan with Text', () => { text.plain('It is a bear!') expect(text.node.childNodes[0].nodeType).toBe(3) expect(text.node.childNodes[0].data).toBe('It is a bear!') }) it('clears content before adding new content with Text', () => { text.plain('It is not a bear!') expect(text.node.childNodes.length).toBe(1) expect(text.node.childNodes[0].data).toBe('It is not a bear!') }) it('restores the content from the dom with Text', () => { text.plain('Just plain text!') expect(text.text()).toBe('Just plain text!') }) it('adds content without a tspan with Tspan', () => { tspan.plain('It is a bear!') expect(tspan.node.childNodes[0].nodeType).toBe(3) expect(tspan.node.childNodes[0].data).toBe('It is a bear!') }) it('clears content before adding new content with Tspan', () => { tspan.plain('It is not a bear!') expect(tspan.node.childNodes.length).toBe(1) expect(tspan.node.childNodes[0].data).toBe('It is not a bear!') }) it('restores the content from the dom with Tspan', () => { // We create a new Tspan here because the one used before was part of text creation // and therefore is marked as newline and that is not what we want to test const tspan = new Tspan().plain('Just plain text!') expect(tspan.text()).toBe('Just plain text!') }) }) describe('length()', () => { it('gets total length of text', () => { text.text(function (add) { add.tspan('The first.') add.tspan('The second.') add.tspan('The third.') }) expect(text.length()).toBeCloseTo( text.get(0).length() + text.get(1).length() + text.get(2).length(), 3 ) }) it('gets total length of tspan', () => { tspan.text(function (add) { add.tspan('The first.') add.tspan('The second.') add.tspan('The third.') }) expect(tspan.length()).toBeCloseTo( tspan.get(0).length() + tspan.get(1).length() + tspan.get(2).length(), 3 ) }) }) describe('build()', () => { it('enables adding multiple plain text nodes when given true for Text', () => { text.clear().build(true) text.plain('A great piece!') text.plain('Another great piece!') expect(text.node.childNodes[0].data).toBe('A great piece!') expect(text.node.childNodes[1].data).toBe('Another great piece!') }) it('enables adding multiple tspan nodes when given true for Text', () => { text.clear().build(true) text.tspan('A great piece!') text.tspan('Another great piece!') expect(text.node.childNodes[0].childNodes[0].data).toBe('A great piece!') expect(text.node.childNodes[1].childNodes[0].data).toBe( 'Another great piece!' ) }) it('disables adding multiple plain text nodes when given false for Text', () => { text.clear().build(true) text.plain('A great piece!') text.build(false).plain('Another great piece!') expect(text.node.childNodes[0].data).toBe('Another great piece!') expect(text.node.childNodes[1]).toBe(undefined) }) it('disables adding multiple tspan nodes when given false for Text', () => { text.clear().build(true) text.tspan('A great piece!') text.build(false).tspan('Another great piece!') expect(text.node.childNodes[0].childNodes[0].data).toBe( 'Another great piece!' ) expect(text.node.childNodes[1]).toBe(undefined) }) it('enables adding multiple plain text nodes when given true for Tspan', () => { tspan.clear().build(true) tspan.plain('A great piece!') tspan.plain('Another great piece!') expect(tspan.node.childNodes[0].data).toBe('A great piece!') expect(tspan.node.childNodes[1].data).toBe('Another great piece!') }) it('enables adding multiple text nodes when given true for Tspan', () => { tspan.clear().build(true) tspan.tspan('A great piece!') tspan.tspan('Another great piece!') expect(tspan.node.childNodes[0].childNodes[0].data).toBe('A great piece!') expect(tspan.node.childNodes[1].childNodes[0].data).toBe( 'Another great piece!' ) }) it('disables adding multiple plain text nodes when given false for Tspan', () => { tspan.clear().build(true) tspan.plain('A great piece!') tspan.build(false).plain('Another great piece!') expect(tspan.node.childNodes[0].data).toBe('Another great piece!') expect(tspan.node.childNodes[1]).toBe(undefined) }) it('disables adding multiple tspan nodes when given false for Tspan', () => { tspan.clear().build(true) tspan.tspan('A great piece!') tspan.build(false).tspan('Another great piece!') expect(tspan.node.childNodes[0].childNodes[0].data).toBe( 'Another great piece!' ) expect(tspan.node.childNodes[1]).toBe(undefined) }) }) }) svg.js-3.2.4/spec/spec/modules/optional/000077500000000000000000000000001463723416200201235ustar00rootroot00000000000000svg.js-3.2.4/spec/spec/modules/optional/arrange.js000066400000000000000000000137711463723416200221110ustar00rootroot00000000000000/* globals describe, expect, it */ import { G, Line } from '../../../../src/main.js' describe('arrange.js', () => { describe('Dom', () => { describe('siblings()', () => { it('returns all siblings including the node itself', () => { const g = new G() const rect = g.rect(100, 100) const circle = g.circle(100) const line = g.line(1, 2, 3, 4) expect(circle.siblings()).toEqual([rect, circle, line]) }) }) describe('position()', () => { it('returns the position in the parent', () => { const g = new G() const rect = g.rect(100, 100) const circle = g.circle(100) const line = g.line(1, 2, 3, 4) expect(rect.position()).toBe(0) expect(circle.position()).toBe(1) expect(line.position()).toBe(2) }) }) describe('next()', () => { it('returns the next sibling', () => { const g = new G() const rect = g.rect(100, 100) const circle = g.circle(100) expect(rect.next()).toBe(circle) }) it('returns undefined if there is no sibling', () => { const g = new G() const rect = g.rect(100, 100) expect(rect.next()).toBe(undefined) }) }) describe('prev()', () => { it('returns the next sibling', () => { const g = new G() const rect = g.rect(100, 100) const circle = g.circle(100) expect(circle.prev()).toBe(rect) }) it('returns undefined if there is no sibling', () => { const g = new G() const rect = g.rect(100, 100) expect(rect.prev()).toBe(undefined) }) }) describe('forward()', () => { it('returns itself', () => { const g = new G() const rect = g.rect(100, 100) expect(rect.forward()).toBe(rect) }) it('moves an element one step forward', () => { const g = new G() const rect = g.rect(100, 100) const circle = g.circle(100) const line = g.line(1, 2, 3, 4) rect.forward() expect(g.children()).toEqual([circle, rect, line]) }) it('does nothing when the element is already the last one', () => { const g = new G() const rect = g.rect(100, 100) const circle = g.circle(100) const line = g.line(1, 2, 3, 4) line.forward() expect(g.children()).toEqual([rect, circle, line]) }) }) describe('backward()', () => { it('returns itself', () => { const g = new G() const rect = g.rect(100, 100) expect(rect.backward()).toBe(rect) }) it('moves an element one step backward', () => { const g = new G() const rect = g.rect(100, 100) const circle = g.circle(100) const line = g.line(1, 2, 3, 4) line.backward() expect(g.children()).toEqual([rect, line, circle]) }) it('does nothing when the element is already the first one', () => { const g = new G() const rect = g.rect(100, 100) const circle = g.circle(100) const line = g.line(1, 2, 3, 4) rect.backward() expect(g.children()).toEqual([rect, circle, line]) }) }) describe('front()', () => { it('returns itself', () => { const g = new G() const rect = g.rect(100, 100) expect(rect.front()).toBe(rect) }) it('moves an element to the front', () => { const g = new G() const rect = g.rect(100, 100) const circle = g.circle(100) const line = g.line(1, 2, 3, 4) rect.front() expect(g.children()).toEqual([circle, line, rect]) }) it('does nothing when the element is already the last one', () => { const g = new G() const rect = g.rect(100, 100) const circle = g.circle(100) const line = g.line(1, 2, 3, 4) line.front() expect(g.children()).toEqual([rect, circle, line]) }) }) describe('back()', () => { it('returns itself', () => { const g = new G() const rect = g.rect(100, 100) expect(rect.back()).toBe(rect) }) it('moves an element to the back', () => { const g = new G() const rect = g.rect(100, 100) const circle = g.circle(100) const line = g.line(1, 2, 3, 4) line.back() expect(g.children()).toEqual([line, rect, circle]) }) it('does nothing when the element is already the first one', () => { const g = new G() const rect = g.rect(100, 100) const circle = g.circle(100) const line = g.line(1, 2, 3, 4) rect.back() expect(g.children()).toEqual([rect, circle, line]) }) }) describe('before()', () => { it('inserts an element before this one', () => { const g = new G() const rect = g.rect(100, 100) const circle = g.circle(100) const line = new Line() circle.before(line) expect(g.children()).toEqual([rect, line, circle]) }) }) describe('after()', () => { it('inserts an element after this one', () => { const g = new G() const rect = g.rect(100, 100) const circle = g.circle(100) const line = new Line() rect.after(line) expect(g.children()).toEqual([rect, line, circle]) }) }) describe('insertBefore()', () => { it('inserts the current element before another one', () => { const g = new G() const rect = g.rect(100, 100) const circle = g.circle(100) const line = new Line().insertBefore(circle) expect(g.children()).toEqual([rect, line, circle]) }) }) describe('insertAfter()', () => { it('inserts the current element after another one', () => { const g = new G() const rect = g.rect(100, 100) const circle = g.circle(100) const line = new Line().insertAfter(rect) expect(g.children()).toEqual([rect, line, circle]) }) }) }) }) svg.js-3.2.4/spec/spec/modules/optional/class.js000066400000000000000000000057031463723416200215730ustar00rootroot00000000000000/* globals describe, expect, it */ import { Rect } from '../../../../src/main.js' describe('class.js', () => { describe('Dom', () => { describe('classes()', () => { it('returns all classes on an element', () => { const rect = new Rect({ class: 'myClass myClass2' }) expect(rect.classes()).toEqual(['myClass', 'myClass2']) }) it('returns an empty array if no class on the element', () => { const rect = new Rect() expect(rect.classes()).toEqual([]) }) }) describe('hasClass()', () => { it('returns true if a class is present on the element', () => { const rect = new Rect({ class: 'myClass myClass2' }) expect(rect.hasClass('myClass')).toBe(true) }) it('returns false if a class is not present on the element', () => { const rect = new Rect({ class: 'myClass myClass2' }) expect(rect.hasClass('myClass3')).toBe(false) }) }) describe('addClass()', () => { it('returns itself', () => { const rect = new Rect({ class: 'myClass myClass2' }) expect(rect.addClass('myClass3')).toBe(rect) }) it('adds a class to the element', () => { const rect = new Rect({ class: 'myClass myClass2' }).addClass( 'myClass3' ) expect(rect.classes()).toEqual(['myClass', 'myClass2', 'myClass3']) }) it('does nothing if class already present on the element', () => { const rect = new Rect({ class: 'myClass myClass2' }).addClass('myClass') expect(rect.classes()).toEqual(['myClass', 'myClass2']) }) }) describe('removeClass()', () => { it('returns itself', () => { const rect = new Rect({ class: 'myClass myClass2' }) expect(rect.removeClass('myClass3')).toBe(rect) }) it('removes a class from the element', () => { const rect = new Rect({ class: 'myClass myClass2' }).removeClass( 'myClass2' ) expect(rect.classes()).toEqual(['myClass']) }) it('does nothing if class is not present on the element', () => { const rect = new Rect({ class: 'myClass myClass2' }).removeClass( 'myClass3' ) expect(rect.classes()).toEqual(['myClass', 'myClass2']) }) }) describe('toggleClass()', () => { it('returns itself', () => { const rect = new Rect({ class: 'myClass myClass2' }) expect(rect.toggleClass('myClass3')).toBe(rect) }) it('removes a class from the element when its present', () => { const rect = new Rect({ class: 'myClass myClass2' }).toggleClass( 'myClass2' ) expect(rect.classes()).toEqual(['myClass']) }) it('adds a class to the element if its not present', () => { const rect = new Rect({ class: 'myClass myClass2' }).toggleClass( 'myClass3' ) expect(rect.classes()).toEqual(['myClass', 'myClass2', 'myClass3']) }) }) }) }) svg.js-3.2.4/spec/spec/modules/optional/css.js000066400000000000000000000113521463723416200212530ustar00rootroot00000000000000/* globals describe, expect, it */ import { Rect } from '../../../../src/main.js' describe('css.js', () => { describe('Dom', () => { describe('css()', () => { describe('as getter', () => { it('returns all css as object', () => { const rect = new Rect({ style: 'fill: none; outline-width: 1px; stroke: none' }) expect(rect.css()).toEqual({ fill: 'none', 'outline-width': '1px', stroke: 'none' }) }) it('returns an object with selected css properties', () => { const rect = new Rect({ style: 'fill: none; outline-width: 1px; stroke: none' }) expect(rect.css(['fill', 'stroke'])).toEqual({ fill: 'none', stroke: 'none' }) }) it('returns a single property with property name given', () => { const rect = new Rect({ style: 'fill: none; outline-width: 1px; stroke: none' }) expect(rect.css('fill')).toBe('none') }) it('correctly returns css vars', () => { const rect = new Rect({ style: '--foo: red;' }) expect(rect.css('--foo')).toBe('red') }) it('returns undefined if css property is not set', () => { const rect = new Rect({ style: 'fill: none; outline-width: 1px; stroke: none' }) expect(rect.css('outline-color')).toBe('') }) }) describe('as setter', () => { it('returns itself', () => { const rect = new Rect({ style: 'fill: none; outline-width: 1px; stroke: none' }) expect(rect.css('fill', 'black')).toBe(rect) }) it('adds a css property', () => { const rect = new Rect({ style: 'fill: none; outline-width: 1px; stroke: none' }) expect(rect.css('stroke-width', '2px').css('stroke-width')).toBe( '2px' ) }) it('changes a css property', () => { const rect = new Rect({ style: 'fill: none; outline-width: 1px; stroke: none' }) expect(rect.css('fill', 'black').css('fill')).toBe('black') }) it('sets an object of properties', () => { const rect = new Rect() expect(rect.css({ fill: 'none', stroke: 'none' }).css()).toEqual({ fill: 'none', stroke: 'none' }) }) it('removes property if empty string is passed as value', () => { const rect = new Rect({ style: 'fill: none; outline-width: 1px; stroke: none' }) expect(rect.css('fill', '').css('fill')).toBe('') }) it('removes property if null is passed as value', () => { const rect = new Rect({ style: 'fill: none; outline-width: 1px; stroke: none' }) expect(rect.css('fill', null).css('fill')).toBe('') }) it('removes property if null is passed as part of object', () => { const rect = new Rect({ style: 'fill: none; outline-width: 1px; stroke: none' }) expect(rect.css({ fill: null, stroke: 'black' }).css('fill')).toBe('') }) it('allows single set of css vars', () => { const rect = new Rect().css('--foo', 'red').css('--foo', 'green') expect(rect.css()).toEqual({ '--foo': 'green' }) }) it('allows multiple set of css vars via object', () => { const rect = new Rect().css({ '--foo': 'red', '--bar': 'green' }) expect(rect.css()).toEqual({ '--foo': 'red', '--bar': 'green' }) }) }) }) describe('show()', () => { it('returns itself', () => { const rect = new Rect() expect(rect.show()).toBe(rect) }) it('removes the display property', () => { const rect = new Rect().hide() expect(rect.show().css('display')).toBe('') }) }) describe('hide()', () => { it('returns itself', () => { const rect = new Rect() expect(rect.hide()).toBe(rect) }) it('sets the css display property to none', () => { const rect = new Rect() expect(rect.hide().css('display')).toBe('none') }) }) describe('visible()', () => { it('returns true if display is not none', () => { const rect = new Rect() expect(rect.show().visible()).toBe(true) expect(rect.css('display', 'block').visible()).toBe(true) }) it('returns false if display is none', () => { const rect = new Rect() expect(rect.hide().visible()).toBe(false) }) }) }) }) svg.js-3.2.4/spec/spec/modules/optional/data.js000066400000000000000000000076261463723416200214050ustar00rootroot00000000000000/* globals describe, expect, it */ import { Rect } from '../../../../src/main.js' describe('data.js', () => { describe('Dom', () => { describe('data()', () => { describe('as getter', () => { it('returns all data as object', () => { const rect = new Rect({ 'data-fill': 'none', 'data-outline-width': '1px', 'data-stroke': 'none' }) expect(rect.data()).toEqual({ fill: 'none', 'outline-width': '1px', stroke: 'none' }) }) it('returns an object with selected data properties', () => { const rect = new Rect({ 'data-fill': 'none', 'data-outline-width': '1px', 'data-stroke': 'none' }) expect(rect.data(['fill', 'stroke'])).toEqual({ fill: 'none', stroke: 'none' }) }) it('returns a single property with property name given', () => { const rect = new Rect({ 'data-fill': 'none', 'data-outline-width': '1px', 'data-stroke': 'none' }) expect(rect.data('fill')).toBe('none') }) it('returns undefined if data property is not set', () => { const rect = new Rect({ 'data-fill': 'none', 'data-outline-width': '1px', 'data-stroke': 'none' }) expect(rect.data('outline-color')).toBe(undefined) }) }) describe('as setter', () => { it('returns itself', () => { const rect = new Rect({ 'data-fill': 'none', 'data-outline-width': '1px', 'data-stroke': 'none' }) expect(rect.data('fill', 'black')).toBe(rect) }) it('adds a data property', () => { const rect = new Rect({ 'data-fill': 'none', 'data-outline-width': '1px', 'data-stroke': 'none' }) expect(rect.data('stroke-width', '2px').data('stroke-width')).toBe( '2px' ) }) it('changes a data property', () => { const rect = new Rect({ 'data-fill': 'none', 'data-outline-width': '1px', 'data-stroke': 'none' }) expect(rect.data('fill', 'black').data('fill')).toBe('black') }) it('sets an object of properties', () => { const rect = new Rect() expect(rect.data({ fill: 'none', stroke: 'none' }).data()).toEqual({ fill: 'none', stroke: 'none' }) }) it('removes property if null is passed as value', () => { const rect = new Rect({ 'data-fill': 'none', 'data-outline-width': '1px', 'data-stroke': 'none' }) expect(rect.data('fill', null).data('fill')).toBe(undefined) }) it('removes property if null is passed as part of object', () => { const rect = new Rect({ 'data-fill': 'none', 'data-outline-width': '1px', 'data-stroke': 'none' }) expect(rect.data({ fill: null, stroke: 'black' }).data('fill')).toBe( undefined ) }) it('converts everything except number and strings to JSON', () => { const rect = new Rect() expect(rect.data('fill', { some: 'object' }).attr('data-fill')).toBe( JSON.stringify({ some: 'object' }) ) expect(rect.data('fill', 5).attr('data-fill')).toBe(5) expect(rect.data('fill', 'string').attr('data-fill')).toBe('string') }) it('does not convert to json with third parameter true', () => { const rect = new Rect() expect( rect.data('fill', { some: 'object' }, true).attr('data-fill') ).toBe({}.toString()) }) }) }) }) }) svg.js-3.2.4/spec/spec/modules/optional/memory.js000066400000000000000000000061641463723416200220000ustar00rootroot00000000000000/* globals describe, expect, it */ import { Rect } from '../../../../src/main.js' describe('memory.js', () => { describe('Dom', () => { describe('memory()', () => { it('returns all memory as object', () => { const rect = new Rect().remember({ fill: 'none', 'outline-width': '1px', stroke: 'none' }) expect(rect.memory()).toEqual({ fill: 'none', 'outline-width': '1px', stroke: 'none' }) }) }) describe('remember()', () => { describe('as getter', () => { it('returns a single property with property name given', () => { const rect = new Rect().remember({ fill: 'none', 'outline-width': '1px', stroke: 'none' }) expect(rect.remember('fill')).toBe('none') }) it('returns undefined if memory property is not set', () => { const rect = new Rect().remember({ fill: 'none', 'outline-width': '1px', stroke: 'none' }) expect(rect.remember('outline-color')).toBe(undefined) }) }) describe('as setter', () => { it('returns itself', () => { const rect = new Rect().remember({ fill: 'none', 'outline-width': '1px', stroke: 'none' }) expect(rect.remember('fill', 'black')).toBe(rect) }) it('adds a memory property', () => { const rect = new Rect().remember({ fill: 'none', 'outline-width': '1px', stroke: 'none' }) expect( rect.remember('stroke-width', '2px').remember('stroke-width') ).toBe('2px') }) it('changes a memory property', () => { const rect = new Rect().remember({ fill: 'none', 'outline-width': '1px', stroke: 'none' }) expect(rect.remember('fill', 'black').remember('fill')).toBe('black') }) it('sets an object of properties', () => { const rect = new Rect() expect( rect.remember({ fill: 'none', stroke: 'none' }).memory() ).toEqual({ fill: 'none', stroke: 'none' }) }) }) }) describe('forget()', () => { it('removes property', () => { const rect = new Rect().remember({ fill: 'none', 'outline-width': '1px', stroke: 'none' }) expect(rect.forget('fill').remember('fill')).toBe(undefined) }) it('removes multiple properties', () => { const rect = new Rect().remember({ fill: 'none', 'outline-width': '1px', stroke: 'none' }) expect(rect.forget('fill', 'stroke').memory()).toEqual({ 'outline-width': '1px' }) }) it('erases the whole object with nothing passed', () => { const rect = new Rect().remember({ fill: 'none', 'outline-width': '1px', stroke: 'none' }) expect(rect.forget().memory()).toEqual({}) }) }) }) }) svg.js-3.2.4/spec/spec/modules/optional/sugar.js000066400000000000000000000342051463723416200216060ustar00rootroot00000000000000/* globals describe, expect, it, beforeEach, spyOn, container */ import { Rect, SVG, Matrix, Ellipse, Gradient } from '../../../../src/main.js' describe('sugar.js', () => { describe('Element/Runner', () => { describe('fill()', () => { describe('as setter', () => { it('returns itself', () => { const rect = new Rect() expect(rect.fill('black')).toBe(rect) }) it('sets a fill color', () => { const rect = new Rect() expect(rect.fill('black').attr('fill')).toBe('black') }) it('sets a fill pattern when pattern given', () => { const canvas = SVG().addTo(container) const pattern = canvas.pattern() const rect = canvas.rect(100, 100) expect(rect.fill(pattern).attr('fill')).toBe(pattern.url()) }) it('sets a fill pattern when image given', () => { const canvas = SVG().addTo(container) const image = canvas.image('spec/fictures/pixel.png') const rect = canvas.rect(100, 100) expect(rect.fill(image).attr('fill')).toBe(image.parent().url()) }) it('sets an object of fill properties', () => { const rect = new Rect() expect( rect .fill({ color: 'black', opacity: 0.5, rule: 'even-odd' }) .attr() ).toEqual({ fill: 'black', 'fill-opacity': 0.5, 'fill-rule': 'even-odd' }) }) }) describe('as getter', () => { it('returns fill color', () => { const rect = new Rect().fill('black') expect(rect.fill()).toBe('black') }) it('returns default fill color if nothing is set', () => { const rect = new Rect() expect(rect.fill()).toBe('#000000') }) }) }) describe('stroke()', () => { describe('as setter', () => { it('returns itself', () => { const rect = new Rect() expect(rect.stroke('black')).toBe(rect) }) it('sets a stroke color', () => { const rect = new Rect() expect(rect.stroke('black').attr('stroke')).toBe('black') }) it('sets a stroke pattern when pattern given', () => { const canvas = SVG().addTo(container) const pattern = canvas.pattern() const rect = canvas.rect(100, 100) expect(rect.stroke(pattern).attr('stroke')).toBe(pattern.url()) }) it('sets a stroke pattern when image given', () => { const canvas = SVG().addTo(container) const image = canvas.image('spec/fictures/pixel.png') const rect = canvas.rect(100, 100) expect(rect.stroke(image).attr('stroke')).toBe(image.parent().url()) }) it('sets an object of stroke properties', () => { const rect = new Rect() expect( rect .stroke({ color: 'black', width: 2, opacity: 0.5, linecap: 'butt', linejoin: 'miter', miterlimit: 10, dasharray: '2 2', dashoffset: 15 }) .attr() ).toEqual({ stroke: 'black', 'stroke-width': 2, 'stroke-opacity': 0.5, 'stroke-linecap': 'butt', 'stroke-linejoin': 'miter', 'stroke-miterlimit': 10, 'stroke-dasharray': '2 2', 'stroke-dashoffset': 15 }) }) it('sets stroke dasharray with array passed', () => { const rect = new Rect().stroke({ dasharray: [2, 2] }) expect(rect.attr()).toEqual({ 'stroke-dasharray': '2 2' }) }) }) describe('as getter', () => { it('returns stroke color', () => { const rect = new Rect().stroke('black') expect(rect.stroke()).toBe('black') }) it('returns default stroke color if nothing is set', () => { const rect = new Rect() expect(rect.stroke()).toBe('#000000') }) }) }) describe('matrix()', () => { it('gets the matrix with no argument passed', () => { const rect = new Rect().transform(new Matrix(1, 0, 1, 1, 1, 0)) expect(rect.matrix()).toEqual(new Matrix(1, 0, 1, 1, 1, 0)) }) it('sets the matrix if matrix given', () => { const rect = new Rect().matrix(new Matrix(1, 0, 1, 1, 1, 0)) expect(rect.matrix()).toEqual(new Matrix(1, 0, 1, 1, 1, 0)) }) it('sets the matrix with 6 arguments given', () => { const rect = new Rect().matrix(1, 0, 1, 1, 1, 0) expect(rect.matrix()).toEqual(new Matrix(1, 0, 1, 1, 1, 0)) }) }) describe('rotate()', function () { it('redirects to transform()', function () { const rect = new Rect() const spy = spyOn(rect, 'transform') rect.rotate(1, 2, 3) expect(spy).toHaveBeenCalledWith({ rotate: 1, ox: 2, oy: 3 }, true) }) }) describe('skew()', function () { it('redirects to transform() with no argument', function () { const rect = new Rect() const spy = spyOn(rect, 'transform') rect.skew() expect(spy).toHaveBeenCalledWith( { skew: [undefined, undefined], ox: undefined, oy: undefined }, true ) }) it('redirects to transform() with one argument', function () { const rect = new Rect() const spy = spyOn(rect, 'transform') rect.skew(5) expect(spy).toHaveBeenCalledWith( { skew: 5, ox: undefined, oy: undefined }, true ) }) it('redirects to transform() with two argument', function () { const rect = new Rect() const spy = spyOn(rect, 'transform') rect.skew(5, 6) expect(spy).toHaveBeenCalledWith( { skew: [5, 6], ox: undefined, oy: undefined }, true ) }) it('redirects to transform() with three arguments', function () { const rect = new Rect() const spy = spyOn(rect, 'transform') rect.skew(5, 6, 7) expect(spy).toHaveBeenCalledWith({ skew: 5, ox: 6, oy: 7 }, true) }) it('redirects to transform() with four arguments', function () { const rect = new Rect() const spy = spyOn(rect, 'transform') rect.skew(5, 6, 7, 8) expect(spy).toHaveBeenCalledWith({ skew: [5, 6], ox: 7, oy: 8 }, true) }) }) describe('shear', () => { it('redirects to transform()', function () { const rect = new Rect() const spy = spyOn(rect, 'transform') rect.shear(1, 2, 3) expect(spy).toHaveBeenCalledWith({ shear: 1, ox: 2, oy: 3 }, true) }) }) describe('scale()', function () { it('redirects to transform() with no argument', function () { const rect = new Rect() const spy = spyOn(rect, 'transform') rect.scale() expect(spy).toHaveBeenCalledWith( { scale: [undefined, undefined], ox: undefined, oy: undefined }, true ) }) it('redirects to transform() with one argument', function () { const rect = new Rect() const spy = spyOn(rect, 'transform') rect.scale(5) expect(spy).toHaveBeenCalledWith( { scale: 5, ox: undefined, oy: undefined }, true ) }) it('redirects to transform() with two argument', function () { const rect = new Rect() const spy = spyOn(rect, 'transform') rect.scale(5, 6) expect(spy).toHaveBeenCalledWith( { scale: [5, 6], ox: undefined, oy: undefined }, true ) }) it('redirects to transform() with three arguments', function () { const rect = new Rect() const spy = spyOn(rect, 'transform') rect.scale(5, 6, 7) expect(spy).toHaveBeenCalledWith({ scale: 5, ox: 6, oy: 7 }, true) }) it('redirects to transform() with four arguments', function () { const rect = new Rect() const spy = spyOn(rect, 'transform') rect.scale(5, 6, 7, 8) expect(spy).toHaveBeenCalledWith({ scale: [5, 6], ox: 7, oy: 8 }, true) }) }) describe('translate()', function () { it('redirects to transform()', function () { const rect = new Rect() const spy = spyOn(rect, 'transform') rect.translate(1, 2) expect(spy).toHaveBeenCalledWith({ translate: [1, 2] }, true) }) }) describe('relative()', () => { it('redirects to transform()', function () { const rect = new Rect() const spy = spyOn(rect, 'transform') rect.relative(1, 2) expect(spy).toHaveBeenCalledWith({ relative: [1, 2] }, true) }) }) describe('flip()', function () { it('redirects to transform()', function () { const rect = new Rect() const spy = spyOn(rect, 'transform') rect.flip('x', 2) expect(spy).toHaveBeenCalledWith({ flip: 'x', origin: 2 }, true) }) it('sets flip to "both" when calling without anything', function () { const rect = new Rect() const spy = spyOn(rect, 'transform') rect.flip() expect(spy).toHaveBeenCalledWith( { flip: 'both', origin: 'center' }, true ) }) // this works because only x and y are valid flip values. Everything else flips on both axis it('sets flip to both and origin to number when called with origin only', function () { const rect = new Rect() const spy = spyOn(rect, 'transform') rect.flip(5) expect(spy).toHaveBeenCalledWith({ flip: 'both', origin: 5 }, true) }) }) describe('opacity()', function () { it('redirects to attr() directly', function () { const rect = new Rect() const spy = spyOn(rect, 'attr') rect.opacity(0.5) expect(spy).toHaveBeenCalledWith('opacity', 0.5) }) }) describe('font()', function () { const txt = 'Some text' let canvas, text beforeEach(() => { canvas = SVG().addTo(container) text = canvas.text(txt) }) it('sets leading when given', function () { const spy = spyOn(text, 'leading') text.font({ leading: 3 }) expect(spy).toHaveBeenCalledWith(3) }) it('sets text-anchor when anchor given', function () { const spy = spyOn(text, 'attr') text.font({ anchor: 'start' }) expect(spy).toHaveBeenCalledWith('text-anchor', 'start') }) it('sets all font properties via attr()', function () { const spy = spyOn(text, 'attr') text.font({ size: 20, family: 'Verdana', weight: 'bold', stretch: 'wider', variant: 'small-caps', style: 'italic' }) expect(spy).toHaveBeenCalledWith('font-size', 20) expect(spy).toHaveBeenCalledWith('font-family', 'Verdana') expect(spy).toHaveBeenCalledWith('font-weight', 'bold') expect(spy).toHaveBeenCalledWith('font-stretch', 'wider') expect(spy).toHaveBeenCalledWith('font-variant', 'small-caps') expect(spy).toHaveBeenCalledWith('font-style', 'italic') }) it('redirects all other stuff directly to attr()', function () { const spy = spyOn(text, 'attr') text.font({ foo: 'bar', bar: 'baz' }) expect(spy).toHaveBeenCalledWith('foo', 'bar') expect(spy).toHaveBeenCalledWith('bar', 'baz') }) it('sets key value pair when called with 2 parameters', function () { const spy = spyOn(text, 'attr') text.font('size', 20) expect(spy).toHaveBeenCalledWith('font-size', 20) }) it('gets value if called with one parameter', function () { const spy = spyOn(text, 'attr') text.font('size') expect(spy).toHaveBeenCalledWith('font-size', undefined) }) }) }) describe('radius()', () => { describe('Rect', () => { it('sets rx and ry on the rectangle', () => { const rect = new Rect().radius(5, 10) expect(rect.attr()).toEqual({ rx: 5, ry: 10 }) }) }) describe('Ellipse', () => { it('sets rx and ry on the rectangle', () => { const rect = new Ellipse().radius(5, 10) expect(rect.attr()).toEqual({ rx: 5, ry: 10 }) }) }) describe('radialGradient', () => { it('sets rx and ry on the rectangle', () => { const rect = new Gradient('radial').radius(5) expect(rect.attr()).toEqual({ r: 5 }) }) }) }) describe('Path', () => { describe('length', () => { it('returns the full length of the path', () => { const canvas = SVG().addTo(container) const path = canvas.path('M0 0 L 0 5') expect(path.length()).toBe(5) }) }) describe('pointAt', () => { it('returns a point at a specific length', () => { const canvas = SVG().addTo(container) const path = canvas.path('M0 0 L 0 5') const point = path.pointAt(3) expect(point.x).toBeCloseTo(0) // chrome has rounding issues -.- expect(point.y).toBe(3) }) }) }) describe('events', () => { ;[ 'click', 'dblclick', 'mousedown', 'mouseup', 'mouseover', 'mouseout', 'mousemove', 'mouseenter', 'mouseleave', 'touchstart', 'touchmove', 'touchleave', 'touchend', 'touchcancel' ].forEach((ev) => { describe(ev, () => { it('calls on() with the eventname set to ' + ev, () => { const rect = new Rect() const spy = spyOn(rect, 'on') const fn = () => {} rect[ev](fn) expect(spy).toHaveBeenCalledWith(ev, fn) }) it( 'calls off() with the eventname set to ' + ev + ' when null is passed as second argument', () => { const rect = new Rect() const spy = spyOn(rect, 'off') rect[ev](null) expect(spy).toHaveBeenCalledWith(ev) } ) }) }) }) }) svg.js-3.2.4/spec/spec/modules/optional/transform.js000066400000000000000000000132201463723416200224720ustar00rootroot00000000000000/* globals describe, expect, it, spyOn, container */ import { Rect, Matrix, SVG } from '../../../../src/main.js' describe('transform.js', () => { describe('untransform()', () => { it('returns itself', () => { const rect = new Rect() expect(rect.untransform()).toBe(rect) }) it('deletes the transform attribute', () => { const rect = new Rect() expect(rect.untransform().attr('transform')).toBe(undefined) }) }) describe('matrixify()', () => { it('reduces all transformations of the transform list into one matrix - 1', () => { const rect = new Rect().attr('transform', 'matrix(1, 0, 1, 1, 0, 1)') expect(rect.matrixify()).toEqual(new Matrix(1, 0, 1, 1, 0, 1)) }) it('reduces all transformations of the transform list into one matrix - 2', () => { const rect = new Rect().attr('transform', 'translate(10, 20) rotate(45)') expect(rect.matrixify()).toEqual( new Matrix().rotate(45).translate(10, 20) ) }) it('reduces all transformations of the transform list into one matrix - 3', () => { const rect = new Rect().attr( 'transform', 'translate(10, 20) rotate(45) skew(1,2) skewX(10) skewY(20)' ) expect(rect.matrixify()).toEqual( new Matrix().skewY(20).skewX(10).skew(1, 2).rotate(45).translate(10, 20) ) }) }) describe('toParent()', () => { it('returns itself', () => { const canvas = SVG().addTo(container) const g = canvas.group() const rect = g.rect(100, 100) expect(rect.toParent(canvas)).toBe(rect) }) it('does nothing if the parent is the the current element', () => { const canvas = SVG().addTo(container) const g = canvas.group() const parent = g.parent() const position = g.position() g.toParent(g) expect(g.parent()).toBe(parent) expect(g.position()).toBe(position) }) it('moves an element to a different container without changing its visual representation - 1', () => { const canvas = SVG().addTo(container) const g = canvas.group().matrix(1, 0, 1, 1, 0, 1) const rect = g.rect(100, 100) rect.toParent(canvas) expect(rect.matrix()).toEqual(new Matrix(1, 0, 1, 1, 0, 1)) expect(rect.parent()).toBe(canvas) }) it('moves an element to a different container without changing its visual representation - 2', () => { const canvas = SVG().addTo(container) const g = canvas.group().translate(10, 20) const rect = g.rect(100, 100) const g2 = canvas.group().rotate(10) rect.toParent(g2) const actual = rect.matrix() const expected = new Matrix().translate(10, 20).rotate(-10) // funny enough the dom seems to shorten the floats and precision gets lost ;[...'abcdef'].forEach((prop) => expect(actual[prop]).toBeCloseTo(expected[prop], 5) ) }) it('inserts the element at the specified position', () => { const canvas = SVG().addTo(container) const g = canvas.group() const rect = g.rect(100, 100) canvas.rect(100, 100) canvas.rect(100, 100) expect(rect.toParent(canvas, 2).position()).toBe(2) }) }) describe('toRoot()', () => { it('calls toParent() with root node', () => { const canvas = SVG().addTo(container) const g = canvas.group().matrix(1, 0, 1, 1, 0, 1) const rect = g.rect(100, 100) const spy = spyOn(rect, 'toParent') rect.toRoot(3) expect(spy).toHaveBeenCalledWith(canvas, 3) }) }) describe('transform()', () => { it('acts as full getter with no argument', () => { const rect = new Rect().attr('transform', 'translate(10, 20) rotate(45)') const actual = rect.transform() const expected = new Matrix().rotate(45).translate(10, 20).decompose() expect(actual).toEqual(expected) }) it('returns a single transformation value when string was passed', () => { const rect = new Rect().attr('transform', 'translate(10, 20) rotate(45)') expect(rect.transform('rotate')).toBe(45) expect(rect.transform('translateX')).toBe(10) expect(rect.transform('translateY')).toBe(20) }) it('sets the transformation with an object', () => { const rect = new Rect().transform({ rotate: 45, translate: [10, 20] }) expect(rect.transform('rotate')).toBe(45) expect(rect.transform('translateX')).toBe(10) expect(rect.transform('translateY')).toBe(20) }) it('performs a relative transformation with flag=true', () => { const rect = new Rect() .transform({ rotate: 45, translate: [10, 20] }) .transform({ rotate: 10 }, true) expect(rect.transform('rotate')).toBeCloseTo(55, 5) // rounding errors expect(rect.transform('translateX')).toBe(10) expect(rect.transform('translateY')).toBe(20) }) it('performs a relative transformation with flag=other matrix', () => { const rect = new Rect() .transform({ rotate: 45, translate: [10, 20] }) .transform({ rotate: 10 }, new Matrix().rotate(30)) expect(rect.transform('rotate')).toBeCloseTo(40, 5) // rounding errors expect(rect.transform('translateX')).toBe(0) expect(rect.transform('translateY')).toBe(0) }) it('performs a relative transformation with flag=other element', () => { const referenceElement = new Rect().transform({ rotate: 30 }) const rect = new Rect() .transform({ rotate: 45, translate: [10, 20] }) .transform({ rotate: 10 }, referenceElement) expect(rect.transform('rotate')).toBeCloseTo(40, 5) // rounding errors expect(rect.transform('translateX')).toBe(0) expect(rect.transform('translateY')).toBe(0) }) }) }) svg.js-3.2.4/spec/spec/types/000077500000000000000000000000001463723416200157725ustar00rootroot00000000000000svg.js-3.2.4/spec/spec/types/Base.js000066400000000000000000000003651463723416200172060ustar00rootroot00000000000000/* globals describe, expect, it, jasmine */ import Base from '../../../src/types/Base.js' const { any } = jasmine describe('Base.js', () => { it('creates a new object of type Base', () => { expect(new Base()).toEqual(any(Base)) }) }) svg.js-3.2.4/spec/spec/types/Box.js000066400000000000000000000304371463723416200170670ustar00rootroot00000000000000/* globals describe, expect, it, beforeEach, afterEach, spyOn, jasmine, container */ import { Box, Matrix, Rect, G, makeInstance as SVG } from '../../../src/main.js' import { withWindow, getWindow } from '../../../src/utils/window.js' import { isNulledBox, domContains } from '../../../src/types/Box.js' const { any, objectContaining } = jasmine // const getBody = () => { // const win = getWindow() // return win.document.body || win.document.documentElement // } describe('Box.js', () => { describe('isNulledBox', () => { it('returns true if x, y, with and height is 0', () => { expect(isNulledBox({ x: 0, y: 0, width: 0, height: 0 })).toBe(true) }) it('returns false if one or more of x, y, with and height is not 0', () => { expect(isNulledBox({ x: 0, y: 0, width: 0, height: 1 })).toBe(false) expect(isNulledBox({ x: 0, y: 1, width: 0, height: 1 })).toBe(false) }) }) describe('domContains()', () => { describe('with native function', () => { it('returns true if node is in the dom', () => { expect(domContains(container)).toBe(true) }) it('returns false if node is not in the dom', () => { const g = new G() const rect = new Rect().addTo(g) expect(domContains(rect.node)).toBe(false) }) }) describe('with polyfill', () => { let containsBackup beforeEach(() => { containsBackup = getWindow().document.documentElement.contains getWindow().document.documentElement.contains = null }) afterEach(() => { getWindow().document.documentElement.contains = containsBackup }) it('returns true if node is in the dom', () => { expect(domContains(container)).toBe(true) }) it('returns false if node is not in the dom', () => { const g = new G() const rect = new Rect().addTo(g) expect(domContains(rect.node)).toBe(false) }) }) }) describe('Box', () => { describe('()', () => { it('creates a new Box with default attributes', () => { const box = new Box() expect(box).toEqual(any(Box)) expect(box).toEqual( objectContaining({ width: 0, height: 0, x: 0, y: 0, w: 0, h: 0, cx: 0, cy: 0, x2: 0, y2: 0 }) ) }) }) describe('init()', () => { it('inits or reinits the box according to input', () => { expect(new Box().init(1, 2, 3, 4).toArray()).toEqual([1, 2, 3, 4]) }) it('works with array input', () => { expect(new Box().init([1, 2, 3, 4]).toArray()).toEqual([1, 2, 3, 4]) }) it('works with 3 arguments as input', () => { expect(new Box().init(1, 2, 3, 4).toArray()).toEqual([1, 2, 3, 4]) }) it('works with string input', () => { expect(new Box().init('1,2,3,4').toArray()).toEqual([1, 2, 3, 4]) }) it('creates a new box from parsed string with exponential values', function () { expect(new Box().init('-1.12e1 1e-2 +2e2 +.3e+4').toArray()).toEqual([ -11.2, 0.01, 200, 3000 ]) }) it('works with object input', () => { expect( new Box().init({ x: 1, y: 2, width: 3, height: 4 }).toArray() ).toEqual([1, 2, 3, 4]) }) it('calculates all derived values correctly', () => { expect(new Box().init(2, 4, 6, 8)).toEqual( objectContaining({ cx: 5, cy: 8, x2: 8, y2: 12, w: 6, h: 8 }) ) }) it('can handle input with left instead of x and top instead of y', () => { expect( new Box().init({ left: 1, top: 2, width: 3, height: 4 }).toArray() ).toEqual([1, 2, 3, 4]) }) }) describe('merge()', () => { it('merges various bounding boxes', () => { var box1 = new Box(50, 50, 100, 100) var box2 = new Box(300, 400, 100, 100) var box3 = new Box(500, 100, 100, 100) var merged = box1.merge(box2).merge(box3) expect(merged.toArray()).toEqual([50, 50, 550, 450]) }) it('returns a new instance', () => { var box1 = new Box(50, 50, 100, 100) var box2 = new Box(300, 400, 100, 100) var merged = box1.merge(box2) expect(merged).toEqual(any(Box)) }) }) describe('transform()', () => { it('transforms the box with given matrix', () => { var box1 = new Box(50, 50, 100, 100).transform( new Matrix(1, 0, 0, 1, 20, 20) ) var box2 = new Box(50, 50, 100, 100).transform( new Matrix(2, 0, 0, 2, 0, 0) ) var box3 = new Box(-200, -200, 100, 100).transform( new Matrix(1, 0, 0, 1, -20, -20) ) expect(box1.toArray()).toEqual([70, 70, 100, 100]) expect(box2.toArray()).toEqual([100, 100, 200, 200]) expect(box3.toArray()).toEqual([-220, -220, 100, 100]) }) it('also works with matrix like input', () => { var box1 = new Box(50, 50, 100, 100).transform( new Matrix(1, 0, 0, 1, 20, 20).toArray() ) var box2 = new Box(50, 50, 100, 100).transform( new Matrix(2, 0, 0, 2, 0, 0).toArray() ) var box3 = new Box(-200, -200, 100, 100).transform( new Matrix(1, 0, 0, 1, -20, -20).toArray() ) expect(box1.toArray()).toEqual([70, 70, 100, 100]) expect(box2.toArray()).toEqual([100, 100, 200, 200]) expect(box3.toArray()).toEqual([-220, -220, 100, 100]) }) }) describe('addOffset()', () => { it('returns a new instance', () => { withWindow({ pageXOffset: 50, pageYOffset: 25 }, () => { const box = new Box(100, 100, 100, 100) const box2 = box.addOffset() expect(box2).toEqual(any(Box)) expect(box2).not.toBe(box) }) }) it('adds the current page offset to the box', () => { withWindow({ pageXOffset: 50, pageYOffset: 25 }, () => { const box = new Box(100, 100, 100, 100).addOffset() expect(box.toArray()).toEqual([150, 125, 100, 100]) }) }) }) describe('toString()', () => { it('returns a string representation of the box', () => { expect(new Box(1, 2, 3, 4).toString()).toBe('1 2 3 4') }) }) describe('toArray()', () => { it('returns an array representation of the box', () => { expect(new Box(1, 2, 3, 4).toArray()).toEqual([1, 2, 3, 4]) }) }) describe('isNulled()', () => { it('checks if the box consists of only zeros', () => { expect(new Box().isNulled()).toBe(true) expect(new Box(1, 2, 3, 4).isNulled()).toBe(false) }) }) }) describe('Element', () => { describe('bbox()', () => { it('returns the bounding box of the element', () => { const canvas = SVG().addTo(container) const rect = new Rect().size(100, 200).move(20, 30).addTo(canvas) expect(rect.bbox()).toEqual(any(Box)) expect(rect.bbox().toArray()).toEqual([20, 30, 100, 200]) }) it('returns the bounding box of the element even if the node is not in the dom', () => { const rect = new Rect().size(100, 200).move(20, 30) expect(rect.bbox().toArray()).toEqual([20, 30, 100, 200]) }) it('throws when it is not possible to get a bbox', () => { const spy = spyOn( getWindow().SVGGraphicsElement.prototype, 'getBBox' ).and.callFake(() => { throw new Error('No BBox for you') }) const rect = new Rect() expect(() => rect.bbox()).toThrow() expect(spy).toHaveBeenCalled() }) }) describe('rbox()', () => { it('returns the BoundingClientRect of the element', () => { const canvas = SVG().addTo(container) const rect = new Rect() .size(100, 200) .move(20, 30) .addTo(canvas) .attr('transform', new Matrix({ scale: 2, translate: [40, 50] })) expect(rect.rbox()).toEqual(any(Box)) expect(rect.rbox().toArray()).toEqual([80, 110, 200, 400]) }) it('returns the rbox box of the element in the coordinate system of the passed element', () => { const canvas = SVG().addTo(container) const group = canvas.group().translate(1, 1) const rect = new Rect() .size(100, 200) .move(20, 30) .addTo(canvas) .attr('transform', new Matrix({ scale: 2, translate: [40, 50] })) expect(rect.rbox(group)).toEqual(any(Box)) expect(rect.rbox(group).toArray()).toEqual([79, 109, 200, 400]) }) // svgdom actually only throws here because a new Rect without dimensions has no bounding box // so in case you would create a rect with with and height this test would fail because // svgdom actually can calculate an rbox for the element // in that case we have to change the test like above so that the getBoundingClientRect call is mocked with a spy it('throws when element is not in dom', () => { expect(() => new Rect().rbox()).toThrow() }) }) describe('inside()', () => { it('checks if a point is in the elements borders', () => { const canvas = SVG().addTo(container) const rect = canvas.rect(100, 100) expect(rect.inside(50, 50)).toBe(true) expect(rect.inside(101, 101)).toBe(false) }) }) describe('viewbox()', () => { it('sets the viewbox of the element', () => { const canvas = SVG().addTo(container).viewbox(10, 10, 200, 200) expect(canvas.attr('viewBox')).toEqual('10 10 200 200') }) it('gets the viewbox of the element', () => { const canvas = SVG().addTo(container).viewbox(10, 10, 200, 200) expect(canvas.viewbox()).toEqual(any(Box)) expect(canvas.viewbox().toArray()).toEqual([10, 10, 200, 200]) }) }) describe('zoom()', () => { it('zooms around the center by default', () => { const canvas = SVG() .size(100, 50) .viewbox(0, 0, 100, 50) .addTo(container) .zoom(2) expect(canvas.attr('viewBox')).toEqual('25 12.5 50 25') }) it('zooms around a point', () => { const canvas = SVG() .size(100, 50) .viewbox(0, 0, 100, 50) .addTo(container) .zoom(2, [0, 0]) expect(canvas.attr('viewBox')).toEqual('0 0 50 25') }) it('gets the zoom', () => { // We use a nested here because its actually harder to get a width and height for a nested svg because clientHeight // is not available const svg = SVG() .size(100, 50) .addTo(container) .nested() .size(100, 50) .viewbox(0, 0, 100, 50) .zoom(2) expect(svg.zoom()).toEqual(2) }) it('gets the zoom with clientHeight', () => { const svg = SVG() .css({ width: '100px', height: '50px' }) .addTo(container) .viewbox(25, 12.5, 50, 25) const node = svg.node // svgdom doesn't support clientHeight // so we mock it here if (typeof node.clientHeight === 'undefined') { node.clientHeight = 50 node.clientWidth = 100 } expect(svg.zoom()).toEqual(2) }) it('throws an error if it is impossible to get an absolute value', () => { const svg = SVG() .size(100, 50) .addTo(container) .nested() .viewbox(0, 0, 100, 50) expect(() => svg.zoom()).toThrowError( 'Impossible to get absolute width and height. Please provide an absolute width and height attribute on the zooming element' ) }) it('handles zoom level 0 which is - which basically sets the viewbox to a very high value', () => { const svg = SVG() .size(100, 50) .viewbox(0, 0, 100, 50) .addTo(container) .zoom(0) expect(svg.zoom()).toBeCloseTo(0, 10) }) it('handles zoom level 0 and can recover from it', () => { const svg = SVG() .size(100, 50) .viewbox(0, 0, 100, 50) .addTo(container) .zoom(0) .zoom(1) expect(svg.zoom()).toBe(1) }) }) }) }) svg.js-3.2.4/spec/spec/types/Color.js000066400000000000000000000335431463723416200174160ustar00rootroot00000000000000/* globals describe, expect, it, beforeEach, spyOn, jasmine */ import { Color } from '../../../src/main.js' const { any } = jasmine describe('Color.js', () => { var color beforeEach(() => { color = new Color({ r: 0, g: 102, b: 255 }) }) describe('()', () => { describe('constructs a color from an object in the correct color space', () => { it('rgb', () => { const color = new Color({ r: 255, g: 0, b: 128 }) expect(color.r).toBe(255) expect(color.g).toBe(0) expect(color.b).toBe(128) expect(color.space).toBe('rgb') }) it('xyz', () => { const color = new Color({ x: 255, y: 0, z: 128 }) expect(color.x).toBe(255) expect(color.y).toBe(0) expect(color.z).toBe(128) expect(color.space).toBe('xyz') }) it('hsl', () => { const color = new Color({ h: 255, s: 0, l: 128 }) expect(color.h).toBe(255) expect(color.s).toBe(0) expect(color.l).toBe(128) expect(color.space).toBe('hsl') }) it('lab', () => { const color = new Color({ l: 255, a: 0, b: 128 }) expect(color.l).toBe(255) expect(color.a).toBe(0) expect(color.b).toBe(128) expect(color.space).toBe('lab') }) it('lch', () => { const color = new Color({ l: 255, c: 0, h: 128 }) expect(color.l).toBe(255) expect(color.c).toBe(0) expect(color.h).toBe(128) expect(color.space).toBe('lch') }) it('cmyk', () => { const color2 = new Color({ c: 20, y: 15, m: 10, k: 5 }) expect(color2.c).toBe(20) expect(color2.m).toBe(10) expect(color2.y).toBe(15) expect(color2.k).toBe(5) expect(color2.space).toBe('cmyk') }) it('and default to rgb when unknown parameters are passed', () => { const color = new Color({ h: 12, b: 10, l: 100 }) expect(color.r).toBe(0) expect(color.g).toBe(0) expect(color.b).toBe(0) expect(color.space).toBe('rgb') }) }) it('constructs a color from an array', () => { const color = new Color([30, 24, 50]) expect(color.r).toBe(30) expect(color.g).toBe(24) expect(color.b).toBe(50) expect(color.space).toBe('rgb') }) it('constructs a color from an array with space in array', () => { const color = new Color([50, 50, 5, 'lab']) expect(color.l).toBe(50) expect(color.a).toBe(50) expect(color.b).toBe(5) expect(color.space).toBe('lab') }) it('constructs a color from an array with space given', () => { const color = new Color([50, 50, 5], 'lab') expect(color.l).toBe(50) expect(color.a).toBe(50) expect(color.b).toBe(5) expect(color.space).toBe('lab') }) it('correclty parses an rgb string', () => { const color = new Color('rgb(255,0,128)') expect(color.r).toBe(255) expect(color.g).toBe(0) expect(color.b).toBe(128) }) it('correclty parses a 3 digit hex string', () => { color = new Color('#f06') expect(color.r).toBe(255) expect(color.g).toBe(0) expect(color.b).toBe(102) }) it('correclty parses a 6 digit hex string', () => { color = new Color('#0066ff') expect(color.r).toBe(0) expect(color.g).toBe(102) expect(color.b).toBe(255) }) it('throws an error if unsupported string format was given', () => { expect(() => new Color('#0066')).toThrowError( "Unsupported string format, can't construct Color" ) }) }) describe('input and output: Importing and exporting colors', () => { describe('toHex()', () => { it('returns a hex color', () => { expect(color.toHex()).toBe('#0066ff') }) }) describe('toRgb()', () => { it('returns a rgb string color', () => { expect(color.toRgb()).toBe('rgb(0,102,255)') }) }) }) describe('color spaces: The color spaces supported by our library', () => { describe('lab()', () => { it('can convert rgb to lab', () => { const color = new Color(255, 0, 128) const lab = color.lab() expect(lab.l).toBeCloseTo(54.88, 1) expect(lab.a).toBeCloseTo(84.55, 1) expect(lab.b).toBeCloseTo(4.065, 1) expect(lab.space).toBe('lab') }) it('can convert from lab to rgb', () => { const lab = new Color(54.88, 84.55, 4.065, 'lab') const rgb = lab.rgb() expect(rgb.r).toBeCloseTo(255, 0) expect(rgb.g).toBeCloseTo(0, 0) expect(rgb.b).toBeCloseTo(128, 0) expect(rgb.space).toBe('rgb') }) it('is invertable', () => { const { r, g, b } = new Color(255, 0, 128).lab().rgb() expect(r).toBeCloseTo(255, 0) expect(g).toBeCloseTo(0, 0) expect(b).toBeCloseTo(128, 0) }) it('handles black', () => { const color = new Color(0, 0, 0).lab().rgb() expect(color.r).toBeCloseTo(0, 0) expect(color.g).toBeCloseTo(0, 0) expect(color.b).toBeCloseTo(0, 0) expect(color.toHex()).toBe('#000000') }) it('handles white', () => { const color = new Color(255, 255, 255).lab().rgb() expect(color.r).toBeCloseTo(255, 0) expect(color.g).toBeCloseTo(255, 0) expect(color.b).toBeCloseTo(255, 0) expect(color.toHex()).toBe('#ffffff') }) }) describe('lch()', () => { it('can convert rgb to lch', () => { const color = new Color(255, 0, 128) const lch = color.lch() expect(lch.l).toBeCloseTo(54.88, 1) expect(lch.c).toBeCloseTo(84.65, 1) expect(lch.h).toBeCloseTo(2.75, 1) expect(lch.space).toBe('lch') }) it('can convert from lch to rgb', () => { const lch = new Color(54.88, 84.65, 2.75, 'lch') const rgb = lch.rgb() expect(rgb.r).toBeCloseTo(255, 0) expect(rgb.g).toBeCloseTo(0, 0) expect(rgb.b).toBeCloseTo(128, 0) expect(rgb.space).toBe('rgb') }) it('is invertable', () => { const { r, g, b } = new Color(255, 0, 128).lch().rgb() expect(r).toBeCloseTo(255, 0) expect(g).toBeCloseTo(0, 0) expect(b).toBeCloseTo(128, 0) }) it('handles black', () => { const color = new Color(0, 0, 0).lch().rgb() expect(color.r).toBeCloseTo(0, 0) expect(color.g).toBeCloseTo(0, 0) expect(color.b).toBeCloseTo(0, 0) expect(color.toHex()).toBe('#000000') }) it('handles white', () => { const color = new Color(255, 255, 255).lch().rgb() expect(color.r).toBeCloseTo(255, 0) expect(color.g).toBeCloseTo(255, 0) expect(color.b).toBeCloseTo(255, 0) expect(color.toHex()).toBe('#ffffff') }) }) describe('hsl()', () => { it('can convert from rgb to hsl', () => { const color = new Color(255, 0, 128) const hsl = color.hsl() expect(hsl.h).toBeCloseTo(329.88, 1) expect(hsl.s).toBeCloseTo(100, 1) expect(hsl.l).toBeCloseTo(50, 1) expect(hsl.space).toBe('hsl') }) it('can convert from hsl to rgb', () => { const hsl = new Color(329.88, 100, 50, 'hsl') const rgb = hsl.rgb() expect(rgb.r).toBeCloseTo(255, 0) expect(rgb.g).toBeCloseTo(0, 0) expect(rgb.b).toBeCloseTo(128, 0) expect(rgb.space).toBe('rgb') }) it('is invertable', () => { const { r, g, b } = new Color(255, 0, 128).hsl().rgb() expect(r).toBeCloseTo(255, 0) expect(g).toBeCloseTo(0, 0) expect(b).toBeCloseTo(128, 0) }) it('handles black', () => { const color = new Color(0, 0, 0).hsl().rgb() expect(color.r).toBeCloseTo(0, 0) expect(color.g).toBeCloseTo(0, 0) expect(color.b).toBeCloseTo(0, 0) expect(color.toHex()).toBe('#000000') }) it('handles white', () => { const color = new Color(255, 255, 255).hsl().rgb() expect(color.r).toBeCloseTo(255, 0) expect(color.g).toBeCloseTo(255, 0) expect(color.b).toBeCloseTo(255, 0) expect(color.toHex()).toBe('#ffffff') }) }) // This conversion is pretty lossy // Especially g is super wrong (which should be 0 at testing and is >170) // describe('xyz()', () => { // it('can convert from rgb to xyz', () => { // const color = new Color(255, 0, 128) // const xyz = color.xyz() // expect(xyz.x).toBeCloseTo(0.780182, 6) // expect(xyz.y).toBeCloseTo(0.611077, 6) // expect(xyz.z).toBeCloseTo(0.590749, 6) // expect(xyz.space).toBe('xyz') // }) // it('can convert from xyz to rgb', () => { // const xyz = new Color(0.780181754521692, 0.6110767760212142, 0.590748864329329, 'xyz') // const rgb = xyz.rgb() // expect(rgb.r).toBeCloseTo(255, 0) // expect(rgb.g).toBeCloseTo(0, 0) // expect(rgb.b).toBeCloseTo(128, 0) // expect(rgb.space).toBe('rgb') // }) // it('is invertable', () => { // const { r, g, b } = new Color(255, 0, 128).xyz().rgb() // expect(r).toBeCloseTo(255, 0) // expect(g).toBeCloseTo(0, 0) // expect(b).toBeCloseTo(128, 0) // }) // it('handles black', () => { // const color = new Color(0, 0, 0).xyz().rgb() // expect(color.r).toBeCloseTo(0, 0) // expect(color.g).toBeCloseTo(0, 0) // expect(color.b).toBeCloseTo(0, 0) // expect(color.toHex()).toBe('#000000') // }) // it('handles white', () => { // const color = new Color(255, 255, 255).xyz().rgb() // expect(color.r).toBeCloseTo(255, 0) // expect(color.g).toBeCloseTo(255, 0) // expect(color.b).toBeCloseTo(255, 0) // expect(color.toHex()).toBe('#ffffff') // }) // }) describe('cmyk()', () => { it('can convert from rgb to cmyk', () => { const color = new Color(255, 0, 128) const cmyk = color.cmyk() expect(cmyk.c).toBeCloseTo(0, 1) expect(cmyk.m).toBeCloseTo(1, 1) expect(cmyk.y).toBeCloseTo(0.49, 1) expect(cmyk.k).toBeCloseTo(0, 1) expect(cmyk.space).toBe('cmyk') }) it('can convert from cmyk to rgb', () => { const color = new Color(0, 1, 0.49, 0, 'cmyk') const rgb = color.rgb() expect(rgb.r).toBeCloseTo(255, -1) expect(rgb.g).toBeCloseTo(0, -1) expect(rgb.b).toBeCloseTo(128, -1) expect(rgb.space).toBe('rgb') }) it('is invertable', () => { const { r, g, b } = new Color(255, 0, 128).cmyk().rgb() expect(r).toBeCloseTo(255, 0) expect(g).toBeCloseTo(0, 0) expect(b).toBeCloseTo(128, 0) }) it('handles black', () => { const color = new Color(0, 0, 0).cmyk().rgb() expect(color.r).toBeCloseTo(0, 0) expect(color.g).toBeCloseTo(0, 0) expect(color.b).toBeCloseTo(0, 0) expect(color.toHex()).toBe('#000000') }) it('handles white', () => { const color = new Color(255, 255, 255).cmyk().rgb() expect(color.r).toBeCloseTo(255, 0) expect(color.g).toBeCloseTo(255, 0) expect(color.b).toBeCloseTo(255, 0) expect(color.toHex()).toBe('#ffffff') }) }) }) describe('static methods', () => { describe('random()', () => { it('returns color', () => { expect(Color.random()).toEqual(any(Color)) }) it('returns color with mode=vibrant', () => { expect(Color.random('vibrant')).toEqual(any(Color)) }) it('returns color with mode=sine', () => { expect(Color.random('sine')).toEqual(any(Color)) }) it('returns color with mode=pastel', () => { expect(Color.random('pastel')).toEqual(any(Color)) }) it('returns color with mode=dark', () => { expect(Color.random('dark')).toEqual(any(Color)) }) it('returns color with mode=rgb', () => { expect(Color.random('rgb')).toEqual(any(Color)) }) it('returns color with mode=lab', () => { expect(Color.random('lab')).toEqual(any(Color)) }) it('returns color with mode=grey', () => { expect(Color.random('grey')).toEqual(any(Color)) }) it('throws an error if mode is unknown', () => { expect(() => Color.random('foo')).toThrowError( 'Unsupported random color mode' ) }) }) describe('test()', () => { it('returns false for non strings', () => { expect(Color.test(1)).toBe(false) }) it('returns true if a given string is a color - hex', () => { expect(Color.test('#abc')).toBe(true) expect(Color.test('#abcdef')).toBe(true) }) it('returns true if a given string is a color - rgb', () => { expect(Color.test('rgb(1,2,3)')).toBe(true) }) it('returns false if a given string is a not a color', () => { expect(Color.test('#1234')).toBe(false) expect(Color.test('#Hallo Welt')).toBe(false) }) }) describe('isRgb()', () => { it('returns true if object has all rgb properties set', () => { expect(Color.isRgb({ r: 12, g: 45, b: 11, blub: true })).toBe(true) }) it('returns false if object has not all rgb properties set or they are not numbers', () => { expect(Color.isRgb({ r: 12, g: 45 })).toBe(false) expect(Color.isRgb({ r: 12, g: 45, b: '1' })).toBe(false) }) }) describe('isColor', () => { it('tests if given value is a color', () => { const spy1 = spyOn(Color, 'isRgb') const spy2 = spyOn(Color, 'test') expect(Color.isColor(new Color())).toBe(true) Color.isColor('#000') const color = { r: 12, g: 45, b: 11 } Color.isColor(color) expect(spy1).toHaveBeenCalledWith('#000') expect(spy1).toHaveBeenCalledWith(color) expect(spy2).toHaveBeenCalledWith('#000') }) }) }) }) svg.js-3.2.4/spec/spec/types/EventTarget.js000066400000000000000000000102311463723416200205550ustar00rootroot00000000000000/* globals describe, expect, it, spyOn, jasmine */ import { EventTarget } from '../../../src/main.js' import { getWindow } from '../../../src/utils/window.js' const { any, objectContaining, createSpy } = jasmine const event = (name) => { const CustomEvent = getWindow().CustomEvent return new CustomEvent(name) } describe('EventTarget.js', () => { describe('()', () => { it('creates a new object of type EventTarget', () => { expect(new EventTarget()).toEqual(any(EventTarget)) }) }) describe('addEventListener()', () => { it('is a noop', () => { const target = new EventTarget() const frozen = Object.freeze(target) frozen.addEventListener() }) }) describe('dispatch()', () => { it('eventually calls dispatchEvent on the target and returns the event', () => { const target = new EventTarget() const spy = spyOn(target, 'dispatchEvent').and.callThrough() const options = { cancelable: false } const event = target.dispatch('bla', 'foo', options) expect(spy).toHaveBeenCalledWith(event) expect(event).toEqual( objectContaining({ type: 'bla', detail: 'foo', cancelable: false }) ) }) }) describe('dispatchEvent()', () => { it('returns true if no events are bound', () => { const target = new EventTarget() expect(target.dispatchEvent(event('event'))).toBe(true) }) it('calls the handler for a bound event', () => { const target = new EventTarget() const spy = createSpy('event') const ev = event('event') target.on('event', spy) const ret = target.dispatchEvent(ev) expect(spy).toHaveBeenCalledWith(ev) expect(ret).toBe(!ev.defaultPrevented) }) it('returns negative default prevented', () => { const target = new EventTarget() const ev = event('event') ev.preventDefault() const ret = target.dispatchEvent(ev) expect(ret).toBe(!ev.defaultPrevented) }) }) describe('fire()', () => { it('calls dispatch and returns the element', () => { const target = new EventTarget() const spy = spyOn(target, 'dispatch') expect(target.fire('event', 'foo', 'bar')).toBe(target) expect(spy).toHaveBeenCalledWith('event', 'foo', 'bar') }) }) describe('getEventHolder()', () => { it('returns itself', () => { const target = new EventTarget() expect(target.getEventHolder()).toBe(target) }) }) describe('getEventTarget()', () => { it('returns itself', () => { const target = new EventTarget() expect(target.getEventTarget()).toBe(target) }) }) describe('off()', () => { it('returns itself', () => { const target = new EventTarget() const spy = createSpy() expect(target.on('event', spy)).toBe(target) }) it('removes an event binding from the target', () => { const target = new EventTarget() const spy = createSpy() target.on('event', spy) target.dispatch('event') expect(spy.calls.count()).toBe(1) target.off('event', spy) target.dispatch('event') expect(spy.calls.count()).toBe(1) }) it('removes an event binding with options from the target', () => { const target = new EventTarget() const spy = createSpy() target.on('event', spy, undefined, { capture: true }) target.dispatch('event') expect(spy.calls.count()).toBe(1) target.off('event', spy, { capture: true }) target.dispatch('event') expect(spy.calls.count()).toBe(1) }) }) describe('on()', () => { it('returns itself', () => { const target = new EventTarget() const spy = createSpy() expect(target.off('event', spy)).toBe(target) }) it('adds an event binding to the target', () => { const target = new EventTarget() const spy = createSpy() expect(spy.calls.count()).toBe(0) target.on('event', spy) target.dispatch('event') expect(spy.calls.count()).toBe(1) }) }) describe('removeEventListener()', () => { it('is a noop', () => { const target = new EventTarget() const frozen = Object.freeze(target) frozen.removeEventListener() }) }) }) svg.js-3.2.4/spec/spec/types/List.js000066400000000000000000000067031463723416200172510ustar00rootroot00000000000000/* globals describe, expect, it, jasmine */ import { List } from '../../../src/main.js' const { any, createSpy, objectContaining } = jasmine describe('List.js', () => { describe('()', () => { it('creates a new List from Array', () => { const list = new List([1, 2, 3]) expect(list).toEqual(any(List)) }) it('creates preallocated List like Array(1)', () => { const list = new List(1) expect(list.length).toBe(1) }) it('is instance of Array', () => { const list = new List([1, 2, 3]) expect(list).toEqual(any(Array)) }) it('allows index access', () => { const list = new List([1, 2, 3]) expect(list[1]).toBe(2) }) }) describe('each()', () => { it('works like map but with context set to the element when a function is passed', () => { const list = new List([1, 2, 3]).each((el) => el * 2) expect(list).toEqual(any(List)) expect(list).toEqual([2, 4, 6]) const spy = createSpy() const obj = {} const list2 = new List([obj]) list2.each(spy) expect(spy.calls.first()).toEqual( objectContaining({ object: obj, args: [obj, 0, list2] }) ) }) it('calls a method on every element in the list and passes arguments when a string is passed', () => { const list = new List([10, 11, 12]) expect(list.each('toString', 16)).toEqual(['a', 'b', 'c']) }) }) describe('toArray()', () => { it('returns a plain array from the contents of the list', () => { const list = new List([1, 2, 3]) const arr = list.toArray() expect(arr).toEqual(any(Array)) expect(arr).not.toEqual(any(List)) expect(arr).toEqual([1, 2, 3]) }) }) describe('static extend()', () => { it('adds new method names to the List', () => { List.extend(['fooBar']) expect(new List().fooBar).toEqual(any(Function)) const obj = { fooBar: createSpy() } new List([obj]).fooBar() expect(obj.fooBar).toHaveBeenCalled() delete List.prototype.fooBar }) it('keeps Array prototype names prefixed with $', () => { // We're picking a function that we know isn't part of core svg.js // If we implement an 'unshift' function at some point, change this to something else if (List.prototype.hasOwnProperty('unshift')) { fail( 'List.unshift is already a function - change this test to use a different name!' ) return } List.extend(['unshift']) expect(new List().unshift).toEqual(any(Function)) expect(new List().$unshift).toEqual(Array.prototype.unshift) // Check that it works! const sourceArray = [ { unshift: () => 1 }, { unshift: () => 2 }, { unshift: () => 3 } ] const list = new List(sourceArray) expect(list).toEqual(sourceArray) expect(list.unshift(0)).toEqual([1, 2, 3]) expect(list.$unshift(0)).toEqual(4) expect(list).toEqual([0].concat(sourceArray)) delete List.prototype.unshift }) it('skips reserved names', () => { const { constructor, each, toArray } = List.prototype List.extend(['constructor', 'each', 'toArray']) expect(List.prototype).toEqual( objectContaining({ constructor, each, toArray }) ) }) it('skips private methods starting with an underscore', () => { List.extend(['_private']) expect(new List()._private).toBe(undefined) }) }) }) svg.js-3.2.4/spec/spec/types/Matrix.js000066400000000000000000000447401463723416200176050ustar00rootroot00000000000000/* globals describe, expect, it, spyOn, jasmine */ import { Matrix, Rect, SVG } from '../../../src/main.js' import { getWindow } from '../../../src/utils/window.js' const { any, objectContaining } = jasmine describe('Matrix.js', () => { const comp = { a: 2, b: 0, c: 0, d: 2, e: 100, f: 50 } describe('initialization', () => { it('creates a new matrix with default values', () => { const matrix = new Matrix() expect(matrix).toEqual( objectContaining({ a: 1, b: 0, c: 0, d: 1, e: 0, f: 0 }) ) }) it('parses the current transform matrix from an element', () => { const rect = new Rect().transform(comp) const matrix = new Matrix(rect) expect(matrix).toEqual(objectContaining(comp)) }) it('parses a string value correctly', () => { const matrix = new Matrix('2, 0, 0, 2, 100, 50') expect(matrix).toEqual(objectContaining(comp)) }) it('parses an array correctly', () => { const matrix = new Matrix([2, 0, 0, 2, 100, 50]) expect(matrix).toEqual(objectContaining(comp)) }) it('parses an object correctly', () => { const matrix = new Matrix(comp) expect(matrix).toEqual(objectContaining(comp)) }) it('parses a transform object correctly', () => { const matrix = new Matrix({ scale: 2, translate: [100, 50] }) expect(matrix).toEqual(objectContaining(comp)) }) it('parses 6 arguments correctly', () => { const matrix = new Matrix(2, 0, 0, 2, 100, 50) expect(matrix).toEqual(objectContaining(comp)) }) it('falls back to base if source is missing values', () => { const matrix = new Matrix([]) expect(matrix).toEqual(new Matrix()) }) }) describe('toString()', () => { it('exports correctly to a string', () => { expect(new Matrix().toString()).toBe('matrix(1,0,0,1,0,0)') }) }) describe('transform()', () => { it('does simple left matrix multiplication if matrixlike object is passed', () => { const matrix = new Matrix().transform(new Matrix().scale(2)) expect(matrix).toEqual(new Matrix().lmultiplyO(new Matrix().scale(2))) }) it('forces the origin to a specific place if position.x is passed', () => { const matrix = new Matrix().transform({ px: 10 }) expect(matrix.e).toBe(10) }) it('forces the origin to a specific place if position.y is passed', () => { const matrix = new Matrix().transform({ py: 10 }) expect(matrix.f).toBe(10) }) }) describe('decompose()', () => { it('decomposes a matrix properly', () => { var matrix = new Matrix() .scale(3, 2.5) .shear(4) .rotate(30) .translate(20, 30) var decomposed = matrix.decompose() expect(decomposed.scaleX).toBeCloseTo(3) expect(decomposed.scaleY).toBeCloseTo(2.5) expect(decomposed.shear).toBeCloseTo(4) expect(decomposed.rotate).toBeCloseTo(30) expect(decomposed.translateX).toBeCloseTo(20) expect(decomposed.translateY).toBeCloseTo(30) }) it('can be recomposed to the same matrix', () => { var matrix = new Matrix() .scale(3, 2.5) .shear(4) .rotate(30) .translate(20, 30) var decomposed = matrix.decompose() // Get rid of the matrix values before recomposing with the matrix constructor for (const prop in 'abcdef') delete decomposed[prop] var composed = new Matrix(decomposed) expect(matrix.a).toBeCloseTo(composed.a) expect(matrix.b).toBeCloseTo(composed.b) expect(matrix.c).toBeCloseTo(composed.c) expect(matrix.d).toBeCloseTo(composed.d) expect(matrix.e).toBeCloseTo(composed.e) expect(matrix.f).toBeCloseTo(composed.f) }) }) describe('clone()', () => { it('returns a clone of the matrix', () => { var matrix = new Matrix(2, 0, 0, 5, 0, 0) var clone = matrix.clone() expect(matrix).not.toBe(clone) for (var i in 'abcdef') { expect(matrix[i]).toEqual(clone[i]) } }) }) describe('multiply()', () => { it('multiplies two matrices', () => { var matrix1 = new Matrix(1, 4, 2, 5, 3, 6) var matrix2 = new Matrix(7, 8, 8, 7, 9, 6) var matrix3 = matrix1.multiply(matrix2) expect(matrix1.toString()).toBe('matrix(1,4,2,5,3,6)') expect(matrix2.toString()).toBe('matrix(7,8,8,7,9,6)') expect(matrix3.toString()).toBe('matrix(23,68,22,67,24,72)') }) it('accepts matrices in any form', () => { var matrix1 = new Matrix(1, 4, 2, 5, 3, 6) var matrix2 = matrix1.multiply('7,8,8,7,9,6') expect(matrix1.toString()).toBe('matrix(1,4,2,5,3,6)') expect(matrix2.toString()).toBe('matrix(23,68,22,67,24,72)') }) }) describe('inverse()', () => { it('inverses matrix', () => { var matrix1 = new Matrix(2, 0, 0, 5, 4, 3) var matrix2 = matrix1.inverse() var abcdef = [0.5, 0, 0, 0.2, -2, -0.6] for (var i in 'abcdef') { expect(matrix2['abcdef'[i]]).toBeCloseTo(abcdef[i]) } }) it('throws if matrix is not invertible', () => { const matrix = new Matrix(0, 0, 0, 0, 0, 0) expect(() => matrix.inverse()).toThrowError( 'Cannot invert matrix(0,0,0,0,0,0)' ) }) }) describe('translate()', () => { it('translates matrix by given x and y values', () => { var matrix = new Matrix(1, 0, 0, 1, 4, 3).translate(10, 12.5) expect(matrix.e).toBe(14) expect(matrix.f).toBe(15.5) }) it('does nothing if you give it no x or y value', () => { var matrix = new Matrix(1, 2, 3, 4, 5, 6).translate() expect(matrix.e).toBe(5) expect(matrix.f).toBe(6) }) }) describe('scale()', () => { it('performs a uniformal scale with one value', () => { var matrix = new Matrix(1, 0, 0, 1, 4, 3).scale(3) expect(matrix.a).toBe(3) expect(matrix.d).toBe(3) expect(matrix.e).toBe(4 * 3) expect(matrix.f).toBe(3 * 3) }) it('performs a non-uniformal scale with two values', () => { var matrix = new Matrix(1, 0, 0, 1, 4, 3).scale(2.5, 3.5) expect(matrix.a).toBe(2.5) expect(matrix.d).toBe(3.5) expect(matrix.e).toBe(4 * 2.5) expect(matrix.f).toBe(3 * 3.5) }) it('performs a uniformal scale at a given center point with three values', () => { var matrix = new Matrix(1, 3, 2, 3, 4, 3).scale(3, 2, 3) expect(matrix.a).toBe(3) expect(matrix.b).toBe(9) expect(matrix.c).toBe(6) expect(matrix.d).toBe(9) expect(matrix.e).toBe(8) expect(matrix.f).toBe(3) }) it('performs a non-uniformal scale at a given center point with four values', () => { var matrix = new Matrix(1, 3, 2, 3, 4, 3).scale(3, 2, 2, 3) expect(matrix.a).toBe(3) expect(matrix.b).toBe(6) expect(matrix.c).toBe(6) expect(matrix.d).toBe(6) expect(matrix.e).toBe(8) expect(matrix.f).toBe(3) }) }) describe('rotate()', () => { it('performs a rotation with one argument', () => { var matrix = new Matrix(1, 3, 2, 3, 4, 3).rotate(30) expect(matrix.a).toBeCloseTo(-0.6339746) expect(matrix.b).toBeCloseTo(3.09807621) expect(matrix.c).toBeCloseTo(0.23205081) expect(matrix.d).toBeCloseTo(3.59807621) expect(matrix.e).toBeCloseTo(1.96410162) expect(matrix.f).toBeCloseTo(4.59807621) }) it('performs a rotation around a given point with three arguments', () => { var matrix = new Matrix(1, 3, 2, 3, 4, 3).rotate(30, 2, 3) expect(matrix.a).toBeCloseTo(-0.633974596216) expect(matrix.b).toBeCloseTo(3.09807621135) expect(matrix.c).toBeCloseTo(0.232050807569) expect(matrix.d).toBeCloseTo(3.59807621135) expect(matrix.e).toBeCloseTo(3.73205080757) expect(matrix.f).toBeCloseTo(4.0) }) }) describe('flip()', () => { describe('with x given', () => { it('performs a flip over the horizontal axis with one argument', () => { var matrix = new Matrix(1, 0, 0, 1, 4, 3).flip('x') expect(matrix.a).toBe(-1) expect(matrix.d).toBe(1) expect(matrix.e).toBe(-4) expect(matrix.f).toBe(3) }) it('performs a flip over the horizontal axis over a given point with two arguments', () => { var matrix = new Matrix(1, 0, 0, 1, 4, 3).flip('x', 150) expect(matrix.a).toBe(-1) expect(matrix.d).toBe(1) expect(matrix.e).toBe(296) expect(matrix.f).toBe(3) }) }) describe('with y given', () => { it('performs a flip over the vertical axis with one argument', () => { var matrix = new Matrix(1, 0, 0, 1, 4, 3).flip('y') expect(matrix.a).toBe(1) expect(matrix.d).toBe(-1) expect(matrix.e).toBe(4) expect(matrix.f).toBe(-3) }) it('performs a flip over the vertical axis over a given point with two arguments', () => { var matrix = new Matrix(1, 0, 0, 1, 4, 3).flip('y', 100) expect(matrix.a).toBe(1) expect(matrix.d).toBe(-1) expect(matrix.e).toBe(4) expect(matrix.f).toBe(197) }) }) describe('with no axis given', () => { it('performs a flip over the horizontal and vertical axis with no argument', () => { var matrix = new Matrix(1, 0, 0, 1, 4, 3).flip() expect(matrix.a).toBe(-1) expect(matrix.d).toBe(-1) expect(matrix.e).toBe(-4) expect(matrix.f).toBe(-3) }) it('performs a flip over the horizontal and vertical axis over a given point with one argument that represent both coordinates', () => { var matrix = new Matrix(1, 0, 0, 1, 4, 3).flip(100) expect(matrix.a).toBe(-1) expect(matrix.d).toBe(-1) expect(matrix.e).toBe(196) expect(matrix.f).toBe(197) }) it('performs a flip over the horizontal and vertical axis over a given point with two arguments', () => { var matrix = new Matrix(1, 0, 0, 1, 4, 3).flip(50, 100) expect(matrix.a).toBe(-1) expect(matrix.d).toBe(-1) expect(matrix.e).toBe(96) expect(matrix.f).toBe(197) }) }) }) describe('skew()', () => { it('performs a uniformal skew with one value', () => { var matrix = new Matrix(1, 0, 0, 1, 4, 3).skew(30) expect(matrix.a).toBe(1) expect(matrix.b).toBeCloseTo(0.57735026919) expect(matrix.c).toBeCloseTo(0.57735026919) expect(matrix.d).toBe(1) expect(matrix.e).toBeCloseTo(5.73205080757) expect(matrix.f).toBeCloseTo(5.30940107676) }) it('performs a non-uniformal skew with two values', () => { var matrix = new Matrix(1, 0, 0, 1, 4, 3).skew(30, 20) expect(matrix.a).toBe(1) expect(matrix.b).toBeCloseTo(0.363970234266) expect(matrix.c).toBeCloseTo(0.57735026919) expect(matrix.d).toBe(1) expect(matrix.e).toBeCloseTo(5.73205080757) expect(matrix.f).toBeCloseTo(4.45588093706) }) it('performs a uniformal skew at a given center point with three values', () => { var matrix = new Matrix(1, 0, 0, 1, 4, 3).skew(30, 150, 100) expect(matrix.a).toBe(1) expect(matrix.b).toBeCloseTo(0.57735026919) expect(matrix.c).toBeCloseTo(0.57735026919) expect(matrix.d).toBe(1) expect(matrix.e).toBeCloseTo(-52.0029761114) expect(matrix.f).toBeCloseTo(-81.2931393017) }) it('performs a non-uniformal skew at a given center point with four values', () => { var matrix = new Matrix(1, 0, 0, 1, 4, 3).skew(30, 20, 150, 100) expect(matrix.a).toBe(1.0) expect(matrix.b).toBeCloseTo(0.363970234266) expect(matrix.c).toBeCloseTo(0.57735026919) expect(matrix.d).toBe(1.0) expect(matrix.e).toBeCloseTo(-52.0029761114) expect(matrix.f).toBeCloseTo(-50.1396542029) }) it('can be chained', () => { var matrix = new Matrix(1, 0, 0, 1, 4, 3).skew(20, 30).skew(30, 20) expect(matrix.a).toBeCloseTo(1.33333333333) expect(matrix.b).toBeCloseTo(0.941320503456) expect(matrix.c).toBeCloseTo(0.941320503456) expect(matrix.d).toBeCloseTo(1.13247433143) expect(matrix.e).toBeCloseTo(8.1572948437) expect(matrix.f).toBeCloseTo(7.16270500812) }) }) describe('skewX', () => { it('performs a skew along the x axis with one value', () => { var matrix = new Matrix(1, 0, 0, 1, 4, 3).skewX(30) expect(matrix.a).toBe(1) expect(matrix.b).toBe(0) expect(matrix.c).toBeCloseTo(0.57735026919) expect(matrix.d).toBe(1) expect(matrix.e).toBeCloseTo(5.73205080757) expect(matrix.f).toBe(3) }) it('performs a skew along the x axis at a given center point with three values', () => { var matrix = new Matrix(1, 0, 0, 1, 4, 3).skewX(30, 150, 100) expect(matrix.a).toBe(1) expect(matrix.b).toBe(0) expect(matrix.c).toBeCloseTo(0.57735026919) expect(matrix.d).toBe(1) expect(matrix.e).toBeCloseTo(-52.0029761114) expect(matrix.f).toBe(3) }) }) describe('skewY', () => { it('performs a skew along the y axis with one value', () => { var matrix = new Matrix(1, 0, 0, 1, 4, 3).skewY(30) expect(matrix.a).toBe(1) expect(matrix.b).toBeCloseTo(0.57735026919) expect(matrix.c).toBe(0) expect(matrix.d).toBe(1) expect(matrix.e).toBe(4) expect(matrix.f).toBeCloseTo(5.30940107676) }) it('performs a skew along the y axis at a given center point with three values', () => { var matrix = new Matrix(1, 0, 0, 1, 4, 3).skewY(30, 150, 100) expect(matrix.a).toBe(1) expect(matrix.b).toBeCloseTo(0.57735026919) expect(matrix.c).toBe(0) expect(matrix.d).toBe(1) expect(matrix.e).toBe(4) expect(matrix.f).toBeCloseTo(-81.2931393017) }) }) describe('around()', () => { it('performs a matrix operation around an origin by shifting the origin to 0,0', () => { const matrix = new Matrix(1, 0, 0, 1, 0, 0).around( 10, 10, new Matrix().scale(2) ) expect(matrix).toEqual(new Matrix(2, 0, 0, 2, -10, -10)) }) it('defaults to around center of 0,0', () => { const matrix = new Matrix(1, 0, 0, 1, 0, 0).around( 0, 0, new Matrix().scale(2) ) expect(matrix).toEqual(new Matrix(2, 0, 0, 2, 0, 0)) }) }) describe('equals()', () => { it('returns true if the same matrix is passed', () => { const matrix = new Matrix() expect(matrix.equals(matrix)).toBe(true) }) it('returns true if the components match', () => { const matrix = new Matrix() expect(matrix.equals(matrix.clone())).toBe(true) }) it('returns false if the components do not match', () => { const matrix = new Matrix() expect(matrix.equals(matrix.scale(2))).toBe(false) }) }) describe('valueOf()', () => { it('returns an object containing the matrix components', () => { const matrix = new Matrix().valueOf() expect(matrix).not.toEqual(any(Matrix)) expect(matrix).toEqual({ a: 1, b: 0, c: 0, d: 1, e: 0, f: 0 }) }) }) describe('toArray', () => { it('converts matrix to array', () => { const arr = new Matrix().toArray() expect(arr).toEqual([1, 0, 0, 1, 0, 0]) }) }) describe('static', () => { describe('fromArray()', () => { it('creates a matrix like object from an array', () => { const matrix = Matrix.fromArray([1, 2, 3, 4, 5, 6]) expect(matrix).not.toEqual(any(Matrix)) expect(matrix).toEqual(new Matrix(1, 2, 3, 4, 5, 6).valueOf()) }) }) describe('isMatrixLike', () => { it('returns true if object contains all components', () => { expect(Matrix.isMatrixLike(new Matrix())).toBe(true) expect(Matrix.isMatrixLike(new Matrix().valueOf())).toBe(true) expect(Matrix.isMatrixLike({ f: 0 })).toBe(true) }) it('returns false if no component is found', () => { expect(Matrix.isMatrixLike({ foo: 'bar' })).toBe(false) }) }) describe('formatTransforms()', () => { it('formats all transform input varieties to a canonical form', () => { expect( Matrix.formatTransforms({ flip: true, skew: 5, scale: 5, originX: 5, originY: 5, positionX: 5, positionY: 5, translateX: 5, translateY: 5, relativeX: 5, relativeY: 5 }) ).toEqual({ scaleX: -5, scaleY: -5, skewX: 5, skewY: 5, shear: 0, theta: 0, rx: 5, ry: 5, tx: 5, ty: 5, ox: 5, oy: 5, px: 5, py: 5 }) }) it('respects flip=x', () => { expect( Matrix.formatTransforms({ flip: 'x', scale: [1, 2], skew: [1, 2] }) ).toEqual( objectContaining({ scaleX: -1, scaleY: 2, skewX: 1, skewY: 2 }) ) }) it('respects flip=y', () => { expect( Matrix.formatTransforms({ flip: 'y', scaleX: 1, scaleY: 2, skewX: 1, skewY: 2 }) ).toEqual( objectContaining({ scaleX: 1, scaleY: -2, skewX: 1, skewY: 2 }) ) }) it('makes position NaN if not passed', () => { expect( Matrix.formatTransforms({ flip: 'y', scaleX: 1, scaleY: 2, skewX: 1, skewY: 2 }) ).toEqual(objectContaining({ px: NaN, py: NaN })) }) }) }) describe('Element', () => { describe('ctm()', () => { it('returns the native ctm wrapped into a matrix', () => { const rect = new Rect() const spy = spyOn(rect.node, 'getCTM') rect.ctm() expect(spy).toHaveBeenCalled() }) }) describe('screenCTM()', () => { it('returns the native screenCTM wrapped into a matrix for a normal element', () => { const rect = new Rect() const spy = spyOn(rect.node, 'getScreenCTM') rect.screenCTM() expect(spy).toHaveBeenCalled() }) it('does extra work for nested svgs because firefox needs it', () => { const spy = spyOn( getWindow().SVGGraphicsElement.prototype, 'getScreenCTM' ) const svg = SVG().nested() svg.screenCTM() expect(spy).toHaveBeenCalled() }) it('does not throw and returns identity matrix if element is not rendered', () => { const canvas = SVG().viewbox(0, 0, 0, 0) expect(canvas.screenCTM()).toEqual(new Matrix()) }) }) }) }) svg.js-3.2.4/spec/spec/types/PathArray.js000066400000000000000000000057361463723416200202360ustar00rootroot00000000000000/* globals describe, expect, it, beforeEach */ import { PathArray, Box } from '../../../src/main.js' describe('PathArray.js', () => { let p1, p2, p3 beforeEach(() => { p1 = new PathArray('m10 10 h 80 v 80 h -80 l 300 400 z') p2 = new PathArray( 'm10 80 c 40 10 65 10 95 80 s 150 150 180 80 t 300 300 q 52 10 95 80 z' ) p3 = new PathArray('m80 80 A 45 45, 0, 0, 0, 125 125 L 125 80 z') }) it('parses flat arrays correctly', () => { const arr = new PathArray(['M', 0, 0, 'L', 100, 100, 'z']) expect(arr.toString()).toBe('M0 0L100 100Z ') }) it('parses nested arrays correctly', () => { const arr = new PathArray([['M', 0, 0], ['L', 100, 100], ['z']]) expect(arr.toString()).toBe('M0 0L100 100Z ') }) // this test is designed to cover a certain line but it doesn't work because of #608 it('returns the valueOf when PathArray is given', () => { const p = new PathArray('m10 10 h 80 v 80 h -80 l 300 400 z') expect(new PathArray(p)).toEqual(p) }) describe('move()', () => { it('moves all points in a straight path', () => { expect(p1.move(100, 200).toString()).toBe( 'M100 200H180V280H100L400 680Z ' ) }) it('moves all points in a curved path', () => { expect(p2.move(100, 200).toString()).toBe( 'M100 200C140 210 165 210 195 280S345 430 375 360T675 660Q727 670 770 740Z ' ) }) it('moves all points in a arc path', () => { expect(p3.move(100, 200).toString()).toBe( 'M100 200A45 45 0 0 0 145 245L145 200Z ' ) }) it('does nothing if passed number is not a number', () => { expect(p3.move()).toEqual(p3) }) }) describe('size()', () => { it('resizes all points in a straight path', () => { expect(p1.size(600, 200).toString()).toBe( 'M10 10H170V43.333333333333336H10L610 210Z ' ) }) it('resizes all points in a curved path', () => { expect(p2.size(600, 200).toString()).toBe( 'M10 80C45.82089552238806 83.70370370370371 68.2089552238806 83.70370370370371 95.07462686567165 109.62962962962963S229.40298507462686 165.1851851851852 256.2686567164179 139.25925925925927T524.9253731343283 250.37037037037038Q571.4925373134329 254.07407407407408 610 280Z ' ) }) it('resizes all points in a arc path', () => { const expected = [ ['M', 80, 80], ['A', 600, 200, 0, 0, 0, 680, 280], ['L', 680, 80], ['Z'] ] const toBeTested = p3.size(600, 200) for (let i = toBeTested.length; i--; ) { expect(toBeTested[i].shift().toUpperCase()).toBe( expected[i].shift().toUpperCase() ) for (let j = toBeTested[i].length; j--; ) { expect(toBeTested[i][j]).toBeCloseTo(expected[i][j]) } } }) }) describe('bbox()', () => { it('calculates the bounding box of the PathArray', () => { const box = new PathArray('M0 0 L 10 10').bbox() expect(box).toEqual(new Box(0, 0, 10, 10)) }) }) }) svg.js-3.2.4/spec/spec/types/Point.js000066400000000000000000000051721463723416200174260ustar00rootroot00000000000000/* globals describe, expect, it, beforeEach, spyOn */ import { Point, Rect, Matrix } from '../../../src/main.js' describe('Point.js', () => { var point describe('initialization', () => { describe('without a source', () => { beforeEach(() => { point = new Point() }) it('creates a new point with default values', () => { expect(point.x).toBe(0) expect(point.y).toBe(0) }) }) describe('with x and y given', () => { it('creates a point with given values', () => { var point = new Point(2, 4) expect(point.x).toBe(2) expect(point.y).toBe(4) }) }) describe('with only x given', () => { it('sets the y value to 0', () => { var point = new Point(7) expect(point.x).toBe(7) expect(point.y).toBe(0) }) }) describe('with array given', () => { it('creates a point from array', () => { var point = new Point([2, 4]) expect(point.x).toBe(2) expect(point.y).toBe(4) }) }) describe('with object given', () => { it('creates a point from object', () => { var point = new Point({ x: 2, y: 4 }) expect(point.x).toBe(2) expect(point.y).toBe(4) }) }) describe('with Point given', () => { it('creates a point from Point', () => { var point = new Point(new Point(2, 4)) expect(point.x).toBe(2) expect(point.y).toBe(4) }) }) }) describe('transform()', () => { it('transforms a point with a matrix', () => { expect( new Point().transform(new Matrix({ translate: [10, 10] })) ).toEqual(new Point(10, 10)) }) it('transforms a point with a transformation object', () => { expect(new Point().transform({ translate: [10, 10] })).toEqual( new Point(10, 10) ) }) }) describe('clone()', () => { it('returns cloned point', () => { var point1 = new Point(1, 1) var point2 = point1.clone() expect(point1).toEqual(point2) expect(point1).not.toBe(point2) }) }) describe('toArray()', () => { it('creates an array representation of Point', () => { const p = new Point(1, 2) expect(p.toArray()).toEqual([1, 2]) }) }) describe('Element', () => { describe('point()', () => { it('transforms a screen point into the coordinate system of the element', () => { const rect = new Rect() spyOn(rect, 'screenCTM').and.callFake( () => new Matrix(1, 0, 0, 1, 20, 20) ) expect(rect.point({ x: 10, y: 10 })).toEqual(new Point(-10, -10)) }) }) }) }) svg.js-3.2.4/spec/spec/types/PointArray.js000066400000000000000000000135741463723416200204320ustar00rootroot00000000000000/* globals describe, expect, it */ import { PointArray, Matrix, Point } from '../../../src/main.js' describe('PointArray.js', () => { const squareString = '0,0 1,0 1,1 0,1' describe('()', () => { it('parses a string to a point array', () => { var array = new PointArray('0,1 -.05,7.95 1000.0001,-200.222') expect(array.valueOf()).toEqual([ [0, 1], [-0.05, 7.95], [1000.0001, -200.222] ]) }) it('parses a points array correctly to string', () => { var array = new PointArray([ [0, 0.15], [-100, -3.141592654], [50, 100] ]) expect(array + '').toBe('0,0.15 -100,-3.141592654 50,100') }) it('parses a flat array of x/y coordinates to a point array', () => { var array = new PointArray([1, 4, 5, 68, 12, 24]) expect(array.valueOf()).toEqual([ [1, 4], [5, 68], [12, 24] ]) }) it('parses points with space delimitered x/y coordinates', () => { var array = new PointArray( '221.08 191.79 0.46 191.79 0.46 63.92 63.8 0.46 284.46 0.46 284.46 128.37 221.08 191.79' ) expect(array + '').toBe( '221.08,191.79 0.46,191.79 0.46,63.92 63.8,0.46 284.46,0.46 284.46,128.37 221.08,191.79' ) }) it('parses points with comma delimitered x/y coordinates', () => { var array = new PointArray( '221.08,191.79,0.46,191.79,0.46,63.92,63.8,0.46,284.46,0.46,284.46,128.37,221.08,191.79' ) expect(array + '').toBe( '221.08,191.79 0.46,191.79 0.46,63.92 63.8,0.46 284.46,0.46 284.46,128.37 221.08,191.79' ) }) it('parses points with comma and space delimitered x/y coordinates', () => { var array = new PointArray( '221.08, 191.79, 0.46, 191.79, 0.46, 63.92, 63.8, 0.46, 284.46, 0.46, 284.46, 128.37, 221.08, 191.79' ) expect(array + '').toBe( '221.08,191.79 0.46,191.79 0.46,63.92 63.8,0.46 284.46,0.46 284.46,128.37 221.08,191.79' ) }) it('parses points with space and comma delimitered x/y coordinates', () => { var array = new PointArray( '221.08 ,191.79 ,0.46 ,191.79 ,0.46 ,63.92 ,63.8 ,0.46 ,284.46 ,0.46 ,284.46 ,128.37 ,221.08 ,191.79' ) expect(array + '').toBe( '221.08,191.79 0.46,191.79 0.46,63.92 63.8,0.46 284.46,0.46 284.46,128.37 221.08,191.79' ) }) it('parses points with redundant spaces at the end', () => { var array = new PointArray( '2176.6,1708.8 2176.4,1755.8 2245.8,1801.5 2297,1787.8 ' ) expect(array + '').toBe( '2176.6,1708.8 2176.4,1755.8 2245.8,1801.5 2297,1787.8' ) }) it('parses points with space delimitered x/y coordinates - even with leading or trailing space', () => { var array = new PointArray(' 1 2 3 4 ') expect(array + '').toBe('1,2 3,4') }) it('parses odd number of points with space delimitered x/y coordinates and silently remove the odd point', () => { // this is according to spec: https://svgwg.org/svg2-draft/shapes.html#DataTypePoints var array = new PointArray('1 2 3') expect(array + '').toBe('1,2') }) it('parses odd number of points in a flat array of x/y coordinates and silently remove the odd point', () => { // this is according to spec: https://svgwg.org/svg2-draft/shapes.html#DataTypePoints var array = new PointArray([1, 2, 3]) expect(array.valueOf()).toEqual([[1, 2]]) }) }) describe('move()', () => { it('moves the whole array by the passed value', () => { const arr = new PointArray([1, 2, 3, 4]).move(10, 10) expect(arr.toArray()).toEqual([10, 10, 12, 12]) }) it('does nothing if values not numbers', () => { const arr = new PointArray([1, 2, 3, 4]).move() expect(arr.toArray()).toEqual([1, 2, 3, 4]) }) }) describe('size()', () => { it('correctly sizes the points over the whole area', () => { var array = new PointArray([10, 10, 20, 20, 30, 30]) expect(array.size(60, 60).valueOf()).toEqual([ [10, 10], [40, 40], [70, 70] ]) }) it('let coordinates untouched when width/height is zero', () => { var array = new PointArray([10, 10, 10, 20, 10, 30]) expect(array.size(60, 60).valueOf()).toEqual([ [10, 10], [10, 40], [10, 70] ]) array = new PointArray([10, 10, 20, 10, 30, 10]) expect(array.size(60, 60).valueOf()).toEqual([ [10, 10], [40, 10], [70, 10] ]) }) }) describe('toString()', () => { it('converts to comma sepereated list', () => { const square = new PointArray(squareString) expect(square.toString()).toEqual(squareString) }) }) describe('toLine', () => { it('returns an object which can be passed to a line as point attributes', () => { const arr = new PointArray([1, 2, 3, 4]) expect(arr.toLine()).toEqual({ x1: 1, y1: 2, x2: 3, y2: 4 }) }) }) describe('transform()', () => { it('translates correctly', () => { const square = new PointArray(squareString) const translation = new Matrix({ translate: [2, 1] }) const newSquare = square.transform(translation) expect(newSquare.toString()).toEqual('2,1 3,1 3,2 2,2') }) it('transforms like Point', () => { const square = new PointArray(squareString) const matrix = new Matrix(1, 2, 3, 4, 5, 6) const newSquare = square.transform(matrix) for (let i = 0; i < square.length; i++) { const squarePoint = new Point(square[i]) const newSquarePoint = new Point(newSquare[i]) expect(squarePoint.transform(matrix)).toEqual(newSquarePoint) } }) it('works with transform object instead of matrix', () => { const square = new PointArray(squareString) const newSquare = square.transform({ translate: [2, 1] }) expect(newSquare.toString()).toEqual('2,1 3,1 3,2 2,2') }) }) }) svg.js-3.2.4/spec/spec/types/SVGArray.js000066400000000000000000000047661463723416200200030ustar00rootroot00000000000000/* globals describe, expect, it, jasmine */ import { Array as SVGArray, PointArray, PathArray } from '../../../src/main.js' const { any } = jasmine describe('SVGArray.js', () => { describe('()', () => { it('preallocates memory if only number is passed', () => { const arr = new SVGArray(1) expect(arr.length).toBe(1) }) it('parses a matrix array correctly to string', () => { const array = new SVGArray([ 0.343, 0.669, 0.119, 0, 0, 0.249, -0.626, 0.13, 0, 0, 0.172, 0.334, 0.111, 0, 0, 0.0, 0.0, 0.0, 1, -0 ]) expect(array + '').toBe( '0.343 0.669 0.119 0 0 0.249 -0.626 0.13 0 0 0.172 0.334 0.111 0 0 0 0 0 1 0' ) }) it('parses space separated string and converts it to array', () => { expect(new SVGArray('1 2 3 4').valueOf()).toEqual([1, 2, 3, 4]) }) it('parses comma separated string and converts it to array', () => { expect(new SVGArray('1,2,3,4').valueOf()).toEqual([1, 2, 3, 4]) }) }) describe('reverse()', () => { it('reverses the array', () => { const array = new SVGArray([1, 2, 3, 4, 5]).reverse() expect(array.valueOf()).toEqual([5, 4, 3, 2, 1]) }) it('returns itself', () => { const array = new SVGArray() expect(array.reverse()).toBe(array) }) }) describe('clone()', () => { it('creates a shallow clone of the array', () => { const array = new SVGArray([1, 2, 3, 4, 5]) const clone = array.clone() expect(array).toEqual(clone) expect(array).not.toBe(clone) }) it('also works with PointArray (one depths clone)', () => { const array = new PointArray([ [1, 2], [3, 4], [5, 6] ]) const clone = array.clone() expect(array).toEqual(clone) expect(array).not.toBe(clone) for (let i = array.length; i--; ) { expect(array[i]).not.toBe(clone[i]) } }) it('also works with PathArray (one depths clone)', () => { const array = new PathArray([ ['M', 1, 2], ['L', 3, 4], ['L', 5, 6] ]) const clone = array.clone() expect(array).toEqual(clone) expect(array).not.toBe(clone) for (let i = array.length; i--; ) { expect(array[i]).not.toBe(clone[i]) } }) }) describe('toSet()', () => { it('creates a Set from the Array', () => { const set = new SVGArray([1, 1, 2, 3]).toSet() expect(set).toEqual(any(Set)) expect(set).toEqual(new Set([1, 2, 3])) }) }) }) svg.js-3.2.4/spec/spec/types/SVGNumber.js000066400000000000000000000145201463723416200201420ustar00rootroot00000000000000/* globals describe, expect, it, beforeEach, jasmine */ import { Number as SVGNumber } from '../../../src/main.js' const { any } = jasmine describe('Number.js', () => { let number beforeEach(() => { number = new SVGNumber() }) describe('()', () => { it('is zero', () => { expect(number.value).toBe(0) }) it('has a blank unit', () => { expect(number.unit).toBe('') }) it('accepts the unit as a second argument', () => { number = new SVGNumber(30, '%') expect(number.value).toBe(30) expect(number.unit).toBe('%') }) it('parses a pixel value', () => { number = new SVGNumber('20px') expect(number.value).toBe(20) expect(number.unit).toBe('px') }) it('parses a percent value', () => { number = new SVGNumber('99%') expect(number.value).toBe(0.99) expect(number.unit).toBe('%') }) it('parses a seconds value', () => { number = new SVGNumber('2s') expect(number.value).toBe(2000) expect(number.unit).toBe('s') }) it('parses a negative percent value', () => { number = new SVGNumber('-89%') expect(number.value).toBe(-0.89) expect(number.unit).toBe('%') }) it('falls back to 0 if given value is NaN', () => { number = new SVGNumber(NaN) expect(number.value).toBe(0) }) it('falls back to maximum value if given number is positive infinite', () => { // eslint-disable-next-line no-loss-of-precision number = new SVGNumber(1.7976931348623157e10308) expect(number.value).toBe(3.4e38) }) it('falls back to minimum value if given number is negative infinite', () => { // eslint-disable-next-line no-loss-of-precision number = new SVGNumber(-1.7976931348623157e10308) expect(number.value).toBe(-3.4e38) }) }) describe('toString()', () => { it('converts the number to a string', () => { expect(number.toString()).toBe('0') }) it('appends the unit', () => { number.value = 1.21 number.unit = 'px' expect(number.toString()).toBe('1.21px') }) it('converts percent values properly', () => { number.value = 1.36 number.unit = '%' expect(number.toString()).toBe('136%') }) it('converts second values properly', () => { number.value = 2500 number.unit = 's' expect(number.toString()).toBe('2.5s') }) }) describe('valueOf()', () => { it('returns a numeric value for default units', () => { expect(typeof number.valueOf()).toBe('number') number = new SVGNumber('12') expect(typeof number.valueOf()).toBe('number') number = new SVGNumber(13) expect(typeof number.valueOf()).toBe('number') }) it('returns a numeric value for pixel units', () => { number = new SVGNumber('10px') expect(typeof number.valueOf()).toBe('number') }) it('returns a numeric value for percent units', () => { number = new SVGNumber('20%') expect(typeof number.valueOf()).toBe('number') }) it('converts to a primitive when multiplying', () => { number.value = 80 expect(number * 4).toBe(320) }) }) describe('plus()', () => { it('returns a new instance', () => { expect(number.plus(4.5)).not.toBe(number) expect(number.plus(4.5)).toEqual(any(SVGNumber)) }) it('adds a given number', () => { expect(number.plus(3.5).valueOf()).toBe(3.5) }) it('adds a given percentage value', () => { expect(number.plus('225%').valueOf()).toBe(2.25) }) it('adds a given pixel value', () => { expect(number.plus('83px').valueOf()).toBe(83) }) it('use the unit of this number as the unit of the returned number by default', () => { expect(new SVGNumber('12s').plus('3%').unit).toBe('s') }) it('use the unit of the passed number as the unit of the returned number when this number as no unit', () => { expect(number.plus('15%').unit).toBe('%') }) }) describe('minus()', () => { it('subtracts a given number', () => { expect(number.minus(3.7).valueOf()).toBe(-3.7) }) it('subtracts a given percentage value', () => { expect(number.minus('223%').valueOf()).toBe(-2.23) }) it('subtracts a given pixel value', () => { expect(number.minus('85px').valueOf()).toBe(-85) }) it('use the unit of this number as the unit of the returned number by default', () => { expect(new SVGNumber('12s').minus('3%').unit).toBe('s') }) it('use the unit of the passed number as the unit of the returned number when this number as no unit', () => { expect(number.minus('15%').unit).toBe('%') }) }) describe('times()', () => { beforeEach(() => { number = number.plus(4) }) it('multiplies with a given number', () => { expect(number.times(3).valueOf()).toBe(12) }) it('multiplies with a given percentage value', () => { expect(number.times('110%').valueOf()).toBe(4.4) }) it('multiplies with a given pixel value', () => { expect(number.times('85px').valueOf()).toBe(340) }) it('use the unit of this number as the unit of the returned number by default', () => { expect(new SVGNumber('12s').times('3%').unit).toBe('s') }) it('use the unit of the passed number as the unit of the returned number when this number as no unit', () => { expect(number.times('15%').unit).toBe('%') }) }) describe('divide()', () => { beforeEach(() => { number = number.plus(90) }) it('divides by a given number', () => { expect(number.divide(3).valueOf()).toBe(30) }) it('divides by a given percentage value', () => { expect(number.divide('3000%').valueOf()).toBe(3) }) it('divides by a given pixel value', () => { expect(number.divide('45px').valueOf()).toBe(2) }) it('use the unit of this number as the unit of the returned number by default', () => { expect(new SVGNumber('12s').divide('3%').unit).toBe('s') }) it('use the unit of the passed number as the unit of the returned number when this number as no unit', () => { expect(number.divide('15%').unit).toBe('%') }) }) describe('convert()', () => { it('changes the unit of the number', () => { const number = new SVGNumber('12px').convert('%') expect(number.toString()).toBe('1200%') }) }) }) svg.js-3.2.4/spec/spec/utils/000077500000000000000000000000001463723416200157665ustar00rootroot00000000000000svg.js-3.2.4/spec/spec/utils/adopter.js000066400000000000000000000170741463723416200177730ustar00rootroot00000000000000/* globals describe, expect, it, beforeEach, afterEach, jasmine */ import { create, makeInstance, nodeOrNew, register, getClass, eid, extend, wrapWithAttrCheck, Rect, Element, root, G, Gradient, Dom, Path, Fragment } from '../../../src/main.js' import { mockAdopt, assignNewId, adopt } from '../../../src/utils/adopter.js' import { buildFixtures } from '../../helpers.js' import { globals, getWindow } from '../../../src/utils/window.js' import { svg } from '../../../src/modules/core/namespaces.js' const { any, createSpy, objectContaining } = jasmine describe('adopter.js', () => { let Node beforeEach(() => { Node = globals.window.Node }) describe('create()', () => { it('creates a node of the specified type', () => { const rect = create('rect') expect(rect).toEqual(any(Node)) expect(rect.nodeName).toBe('rect') }) }) describe('makeInstance()', () => { const adoptSpy = createSpy('adopt', adopt).and.callThrough() beforeEach(() => { adoptSpy.calls.reset() mockAdopt(adoptSpy) }) afterEach(() => { mockAdopt() }) it('creates a root-object when no argument given', () => { const doc = makeInstance() expect(doc).toEqual(any(getClass(root))) expect(doc).toEqual(any(Element)) }) it('returns a given svg.js object directly', () => { const rect = new Rect() const samerect = makeInstance(rect) expect(rect).toBe(samerect) }) it('creates an element from passed svg string', () => { const rect = makeInstance('') expect(adoptSpy).toHaveBeenCalledWith(any(Node)) expect(adoptSpy).toHaveBeenCalledWith( objectContaining({ nodeName: 'rect' }) ) expect(rect).toEqual(any(Rect)) expect(rect.parent()).toBe(null) }) it('creates an element in the html namespace from passed html string', () => { const div = makeInstance('
', true) expect(adoptSpy).toHaveBeenCalledWith(any(Node)) expect(adoptSpy).toHaveBeenCalledWith( objectContaining({ nodeName: 'DIV', namespaceURI: 'http://www.w3.org/1999/xhtml' }) ) expect(div).toEqual(any(Dom)) expect(div.parent()).toBe(null) }) it('does not have its wrapper attached', () => { const rect = makeInstance('') expect(rect.parent()).toBe(null) }) it('searches for element in dom if selector given', () => { buildFixtures() const path = globals.window.document.getElementById('lineAB') const pathInst = makeInstance('#lineAB') const noEl = makeInstance('#doesNotExist') expect(adoptSpy).toHaveBeenCalledWith(path) expect(adoptSpy).toHaveBeenCalledWith(null) expect(pathInst).toEqual(any(Path)) expect(noEl).toBe(null) }) it('calls adopt when passed a node', () => { const rect = makeInstance(create('rect')) expect(adoptSpy).toHaveBeenCalledWith(any(Node)) expect(adoptSpy).toHaveBeenCalledWith( objectContaining({ nodeName: 'rect' }) ) expect(rect).toEqual(any(Rect)) }) }) describe('adopt()', () => { it('returns null of passed node is null', () => { expect(adopt(null)).toBe(null) }) it('returns instance from node if present', () => { const rect = new Rect() expect(adopt(rect.node)).toBe(rect) }) it('creates Fragment when document fragment is passed', () => { const frag = getWindow().document.createDocumentFragment() expect(adopt(frag)).toEqual(any(Fragment)) }) it('creates instance when node without instance is passed', () => { const rect = new Rect() const node = rect.node delete node.instance expect(adopt(node)).toEqual(any(Rect)) expect(adopt(node)).not.toBe(rect) }) it('creates instance when node without instance is passed with gradients', () => { const gradient = new Gradient('linear') const node = gradient.node delete node.instance expect(adopt(node)).toEqual(any(Gradient)) expect(adopt(node).type).toBe('linearGradient') expect(adopt(node)).not.toBe(gradient) }) it('creates Dom instances for unknown nodes', () => { const div = getWindow().document.createElement('div') expect(adopt(div)).toEqual(any(Dom)) }) }) describe('nodeOrNew()', () => { it('creates a node of node argument is null', () => { const rect = nodeOrNew('rect', null) expect(rect).toEqual(any(Node)) expect(rect.nodeName).toBe('rect') }) it('returns the node if one is passed', () => { const div = globals.window.document.createElement('div') const node = nodeOrNew('something', div) // jasmine chucks on this when using the node directly expect(node.outerHTML).toBe(div.outerHTML) }) it('gracefully handles nodes that are not yet imported into the document', () => { const otherDoc = globals.document.implementation.createDocument( svg, 'svg' ) const rect = otherDoc.createElementNS(svg, 'rect') const node = nodeOrNew('rect', rect) expect(node).toEqual(rect) }) }) describe('register()/getClass()', () => { it('sets and gets a class from the class register', () => { const A = class {} register(A) expect(getClass('A')).toBe(A) }) }) describe('eid()', () => { it('returns a unique id', () => { expect(eid('foo')).not.toBe(eid('foo')) }) }) describe('assignNewId()', () => { it('assigns a new id if id is present on element', () => { const rect = new Rect().id('foo') assignNewId(rect.node) expect(rect.id()).not.toBe('foo') }) it('does not set id if no id is present on element', () => { const rect = new Rect() assignNewId(rect.node) expect(rect.attr('id')).toBe(undefined) }) it('recursively sets new ids on children', () => { const group = new G().id('foo') const rect = group.rect(100, 100).id('bar') assignNewId(group.node) expect(group.id()).not.toBe('foo') expect(rect.id()).not.toBe('bar') }) }) describe('extend()', () => { it('adds all functions in the given object to the target object', () => { const A = class {} extend(A, { test() { this.prop = 'test' return this } }) expect(typeof A.prototype.test).toBe('function') expect(new A().test().prop).toBe('test') }) it('accepts and extend multiple modules at once', () => { const A = class {} const B = class {} const C = class {} extend([A, B, C], { test() { this.prop = 'test' return this } }) expect(typeof A.prototype.test).toBe('function') expect(new A().test().prop).toBe('test') expect(typeof B.prototype.test).toBe('function') expect(new B().test().prop).toBe('test') expect(typeof C.prototype.test).toBe('function') expect(new C().test().prop).toBe('test') }) }) describe('wrapWithAttrCheck()', () => { it('wraps a function so that it calls an attr function if an object is passed', () => { const attrSpy = createSpy('attr') const A = class {} extend(A, { test: wrapWithAttrCheck(function () { this.prop = 'test' return this }), attr: attrSpy }) const obj = {} expect(new A().test().prop).toBe('test') expect(attrSpy).not.toHaveBeenCalled() new A().test(obj) expect(attrSpy).toHaveBeenCalledWith(obj) }) }) }) svg.js-3.2.4/spec/spec/utils/methods.js000066400000000000000000000015341463723416200177720ustar00rootroot00000000000000/* globals describe, expect, it */ import { registerMethods, getMethodsFor, getMethodNames } from '../../../src/utils/methods.js' describe('methods.js', () => { describe('registerMethods() / getMethodsFor() / addMethodNames / getMethodNames()', () => { it('adds methods for a given type of classes with object given', () => { const foo = { func1: () => {} } registerMethods({ foo }) expect(getMethodsFor('foo')).toEqual(foo) }) it('adds methods for a given type of classes with 2 parameters given', () => { const foo = { func1: () => {} } registerMethods('foo', foo) expect(getMethodsFor('foo')).toEqual(foo) }) it('adds a method name', () => { registerMethods({ bar: { func2: () => {} } }) expect(getMethodNames()).toContain('func2') }) }) }) svg.js-3.2.4/spec/spec/utils/pathParser.js000066400000000000000000000114161463723416200204400ustar00rootroot00000000000000/* globals describe expect it */ import { pathParser } from '../../../src/utils/pathParser.js' describe('pathParser.js', () => { describe('pathParser()', () => { it('parses all paths correctly', () => { expect(pathParser('M2,0a2 2 0 00-2 2a2 2 0 002 2a.5.5 0 011 0z')).toEqual( [ ['M', 2, 0], ['A', 2, 2, 0, 0, 0, 0, 2], ['A', 2, 2, 0, 0, 0, 2, 4], ['A', 0.5, 0.5, 0, 0, 1, 3, 4], ['Z'] ] ) expect(pathParser('M2,0a2 2 0 00-2 2a2 2 0 002 2a.5.5 0 111 0z')).toEqual( [ ['M', 2, 0], ['A', 2, 2, 0, 0, 0, 0, 2], ['A', 2, 2, 0, 0, 0, 2, 4], ['A', 0.5, 0.5, 0, 1, 1, 3, 4], ['Z'] ] ) expect(pathParser('m10 10 h 80 v 80 h -80 l 300 400 z')).toEqual([ ['M', 10, 10], ['H', 90], ['V', 90], ['H', 10], ['L', 310, 490], ['Z'] ]) expect( pathParser( 'm10 80 c 40 10 65 10 95 80 s 150 150 180 80 t 300 300 q 52 10 95 80 z' ) ).toEqual([ ['M', 10, 80], ['C', 50, 90, 75, 90, 105, 160], ['S', 255, 310, 285, 240], ['T', 585, 540], ['Q', 637, 550, 680, 620], ['Z'] ]) expect(pathParser('m80 80 A 45 45, 0, 0, 0, 125 125 L 125 80 z')).toEqual( [['M', 80, 80], ['A', 45, 45, 0, 0, 0, 125, 125], ['L', 125, 80], ['Z']] ) expect( pathParser( 'M215.458,245.23c0,0,77.403,0,94.274,0S405,216.451,405,138.054S329.581,15,287.9,15c-41.68,0-139.924,0-170.688,0C86.45,15,15,60.65,15,134.084c0,73.434,96.259,112.137,114.122,112.137C146.984,246.221,215.458,245.23,215.458,245.23z' ) ).toEqual([ ['M', 215.458, 245.23], ['C', 215.458, 245.23, 292.861, 245.23, 309.73199999999997, 245.23], ['S', 405, 216.451, 405, 138.054], ['S', 329.581, 15, 287.9, 15], [ 'C', 246.21999999999997, 15, 147.97599999999997, 15, 117.21199999999999, 15 ], ['C', 86.45, 15, 15, 60.65, 15, 134.084], ['C', 15, 207.518, 111.259, 246.221, 129.122, 246.221], ['C', 146.984, 246.221, 215.458, 245.23, 215.458, 245.23], ['Z'] ]) expect( pathParser('M10 10-45-30.5.5 .89L2e-2.5.5-.5C.5.5.5.5.5.5L-3-4z') ).toEqual([ ['M', 10, 10], ['L', -45, -30.5], ['L', 0.5, 0.89], ['L', 0.02, 0.5], ['L', 0.5, -0.5], ['C', 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], ['L', -3, -4], ['Z'] ]) expect( pathParser( 'm 0,0 0,3189 2209,0 0,-3189 -2209,0 z m 154,154 1901,0 0,2881 -1901,0 0,-2881 z' ) ).toEqual([ ['M', 0, 0], ['L', 0, 3189], ['L', 2209, 3189], ['L', 2209, 0], ['L', 0, 0], ['Z'], ['M', 154, 154], ['L', 2055, 154], ['L', 2055, 3035], ['L', 154, 3035], ['L', 154, 154], ['Z'] ]) expect(pathParser('m 0,0 a 45 45, 0, 0, 0, 125 125')).toEqual([ ['M', 0, 0], ['A', 45, 45, 0, 0, 0, 125, 125] ]) expect(pathParser('M10 10 80 80 30 30 Z')).toEqual([ ['M', 10, 10], ['L', 80, 80], ['L', 30, 30], ['Z'] ]) expect(pathParser('M10 10L.5.5.3.3Z')).toEqual([ ['M', 10, 10], ['L', 0.5, 0.5], ['L', 0.3, 0.3], ['Z'] ]) // "a" commands without optional whitespace around the flag params and ending coordinate pair expect(pathParser('a32 32 0 00.03-45.22', false)).toEqual([ ['a', 32.0, 32.0, 0.0, 0.0, 0.0, 0.03, -45.22] ]) expect(pathParser('a48 48 0 1148-48', false)).toEqual([ ['a', 48.0, 48.0, 0.0, 1.0, 1.0, 48.0, -48.0] ]) expect(pathParser('a82.6 82.6 0 0033.48-20.25', false)).toEqual([ ['a', 82.6, 82.6, 0.0, 0.0, 0.0, 33.48, -20.25] ]) expect(pathParser('a82.45 82.45 0 00-20.24 33.47', false)).toEqual([ ['a', 82.45, 82.45, 0.0, 0.0, 0.0, -20.24, 33.47] ]) expect(pathParser('a2.51 2.51 0 01.25.32', false)).toEqual([ ['a', 2.51, 2.51, 0, 0, 1, 0.25, 0.32] ]) expect(pathParser('a2.51 2.51 0 00.25.32', false)).toEqual([ ['a', 2.51, 2.51, 0, 0, 0, 0.25, 0.32] ]) expect(pathParser('a2.51 2.51 0 000.25.32', false)).toEqual([ ['a', 2.51, 2.51, 0, 0, 0, 0.25, 0.32] ]) expect(pathParser('a48 48 0 1148-48 48 48 0 01-48 48', false)).toEqual([ ['a', 48.0, 48.0, 0.0, 1.0, 1.0, 48.0, -48.0], ['a', 48.0, 48.0, 0.0, 0.0, 1.0, -48.0, 48.0] ]) expect(pathParser('M0+0 L100+0 L50+100')).toEqual([ ['M', 0, 0], ['L', 100, 0], ['L', 50, 100] ]) }) }) }) svg.js-3.2.4/spec/spec/utils/utils.js000066400000000000000000000117631463723416200174740ustar00rootroot00000000000000/* globals describe, expect, it, beforeEach, jasmine */ import { map, filter, radians, degrees, unCamelCase, capitalize, proportionalSize, getOrigin } from '../../../src/utils/utils.js' const { any } = jasmine describe('utils.js', function () { describe('map()', function () { var arr1 var arr2 beforeEach(function () { arr1 = [1, 2, 3, 4] arr2 = map(arr1, function (el) { return el * 2 }) }) it('returns a new array', function () { expect(arr2).toEqual(any(Array)) expect(arr2).not.toBe(arr1) }) it('executes a function on every element and returns the result in a new array', function () { expect(arr2).toEqual([2, 4, 6, 8]) }) }) describe('filter()', function () { var arr1 var arr2 beforeEach(function () { arr1 = [1, 2, 3, 4] arr2 = filter(arr1, function (el) { return el % 2 === 0 }) }) it('returns a new array', function () { expect(arr2).toEqual(any(Array)) expect(arr2).not.toBe(arr1) }) it('filters elements by function', function () { expect(arr2).toEqual([2, 4]) }) }) describe('radians()', function () { it('converts degrees to radians', function () { expect(radians(270)).toBe(1.5 * Math.PI) expect(radians(90)).toBe(Math.PI / 2) }) it('caps at 360 degrees', function () { expect(radians(360)).toBe(0) expect(radians(360 + 180)).toBe(Math.PI) }) }) describe('degrees()', function () { it('converts radians to degrees', function () { expect(degrees(1.5 * Math.PI)).toBe(270) expect(degrees(Math.PI / 2)).toBe(90) }) it('caps at 2 PI', function () { expect(degrees(2 * Math.PI)).toBe(0) expect(degrees(3 * Math.PI)).toBe(180) }) }) describe('unCamelCase()', function () { it('converts camelCase to dash-case', function () { var dash1 = 'dash-1' var dashTwo = 'dash-two' var camelOne = 'camelOne' var pascalOne = 'PascalOne' expect(unCamelCase(dash1)).toBe('dash-1') expect(unCamelCase(dashTwo)).toBe('dash-two') expect(unCamelCase(camelOne)).toBe('camel-one') expect(unCamelCase(pascalOne)).toBe('-pascal-one') }) }) describe('capitalize()', function () { it('capitalizes the first letter', function () { var dash1 = 'dash-1' var dashTwo = 'dash-two' var camelOne = 'camelOne' var pascalOne = 'PascalOne' expect(capitalize(dash1)).toBe('Dash-1') expect(capitalize(dashTwo)).toBe('Dash-two') expect(capitalize(camelOne)).toBe('CamelOne') expect(capitalize(pascalOne)).toBe('PascalOne') }) }) describe('proportionalSize()', function () { var box = { width: 150, height: 100 } var el = { bbox: () => ({ width: 200, height: 100 }) } it('calculates height proportionally', function () { expect(proportionalSize(el, 400, null)).toEqual({ width: 400, height: 200 }) }) it('calculates width proportionally', function () { expect(proportionalSize(el, null, 200)).toEqual({ width: 400, height: 200 }) }) it('prefers passed box over element', function () { expect(proportionalSize(el, 300, null, box)).toEqual({ width: 300, height: 200 }) expect(proportionalSize(el, null, 200, box)).toEqual({ width: 300, height: 200 }) }) }) describe('getOrigin()', function () { var el = { bbox: () => ({ width: 200, height: 100, x: 300, y: 400 }) } it('gets the origin from [ox, oy]', function () { var origin = { origin: [10, 20] } expect(getOrigin(origin, el)).toEqual([10, 20]) }) it('gets the origin from [ox, oy] as strings', function () { var origin = { origin: ['center', 'top'] } expect(getOrigin(origin, el)).toEqual([400, 400]) }) it('gets the origin from {x, y}', function () { var origin = { origin: { x: 10, y: 20 } } expect(getOrigin(origin, el)).toEqual([10, 20]) }) it('gets the origin from {ox, oy}', function () { var origin = { ox: 10, oy: 20 } expect(getOrigin(origin, el)).toEqual([10, 20]) }) it('gets the origin from {ox, oy} as strings', function () { var origin = { ox: 'center', oy: 'top' } expect(getOrigin(origin, el)).toEqual([400, 400]) }) it('gets the origin from {originX, originY}', function () { var origin = { originX: 10, originY: 20 } expect(getOrigin(origin, el)).toEqual([10, 20]) }) it('gets the origin from {originX, originY} as strings', function () { var origin = { originX: 'center', originY: 'top' } expect(getOrigin(origin, el)).toEqual([400, 400]) }) it('gets the origin from string', function () { var origin = { origin: 'center top' } expect(getOrigin(origin, el)).toEqual([400, 400]) }) it('gets the origin from number', function () { var origin = { origin: 5 } expect(getOrigin(origin, el)).toEqual([5, 5]) }) }) }) svg.js-3.2.4/spec/spec/utils/window.js000066400000000000000000000021601463723416200176320ustar00rootroot00000000000000/* globals describe, expect, it */ import { registerWindow, globals, withWindow, getWindow, saveWindow, restoreWindow } from '../../../src/utils/window.js' describe('window.js', () => { describe('registerWindow()', () => { it('sets a new window as global', () => { saveWindow() const win = {} const doc = {} registerWindow(win, doc) expect(globals.window).toBe(win) expect(globals.document).toBe(doc) restoreWindow() // we need this or jasmine will fail in afterAll }) }) describe('withWindow()', () => { it('runs a function in the specified window context', () => { const win = { foo: 'bar', document: {} } const oldWindow = globals.window expect(globals.window).not.toBe(win) withWindow({ foo: 'bar', document: {} }, () => { expect(globals.window).toEqual(win) expect(globals.document).toEqual(win.document) }) expect(globals.window).toBe(oldWindow) }) }) describe('getWindow()', () => { it('returns the registered window', () => { expect(getWindow()).toBe(globals.window) }) }) }) svg.js-3.2.4/src/000077500000000000000000000000001463723416200135315ustar00rootroot00000000000000svg.js-3.2.4/src/animation/000077500000000000000000000000001463723416200155105ustar00rootroot00000000000000svg.js-3.2.4/src/animation/Animator.js000066400000000000000000000054301463723416200176220ustar00rootroot00000000000000import { globals } from '../utils/window.js' import Queue from './Queue.js' const Animator = { nextDraw: null, frames: new Queue(), timeouts: new Queue(), immediates: new Queue(), timer: () => globals.window.performance || globals.window.Date, transforms: [], frame(fn) { // Store the node const node = Animator.frames.push({ run: fn }) // Request an animation frame if we don't have one if (Animator.nextDraw === null) { Animator.nextDraw = globals.window.requestAnimationFrame(Animator._draw) } // Return the node so we can remove it easily return node }, timeout(fn, delay) { delay = delay || 0 // Work out when the event should fire const time = Animator.timer().now() + delay // Add the timeout to the end of the queue const node = Animator.timeouts.push({ run: fn, time: time }) // Request another animation frame if we need one if (Animator.nextDraw === null) { Animator.nextDraw = globals.window.requestAnimationFrame(Animator._draw) } return node }, immediate(fn) { // Add the immediate fn to the end of the queue const node = Animator.immediates.push(fn) // Request another animation frame if we need one if (Animator.nextDraw === null) { Animator.nextDraw = globals.window.requestAnimationFrame(Animator._draw) } return node }, cancelFrame(node) { node != null && Animator.frames.remove(node) }, clearTimeout(node) { node != null && Animator.timeouts.remove(node) }, cancelImmediate(node) { node != null && Animator.immediates.remove(node) }, _draw(now) { // Run all the timeouts we can run, if they are not ready yet, add them // to the end of the queue immediately! (bad timeouts!!! [sarcasm]) let nextTimeout = null const lastTimeout = Animator.timeouts.last() while ((nextTimeout = Animator.timeouts.shift())) { // Run the timeout if its time, or push it to the end if (now >= nextTimeout.time) { nextTimeout.run() } else { Animator.timeouts.push(nextTimeout) } // If we hit the last item, we should stop shifting out more items if (nextTimeout === lastTimeout) break } // Run all of the animation frames let nextFrame = null const lastFrame = Animator.frames.last() while (nextFrame !== lastFrame && (nextFrame = Animator.frames.shift())) { nextFrame.run(now) } let nextImmediate = null while ((nextImmediate = Animator.immediates.shift())) { nextImmediate() } // If we have remaining timeouts or frames, draw until we don't anymore Animator.nextDraw = Animator.timeouts.first() || Animator.frames.first() ? globals.window.requestAnimationFrame(Animator._draw) : null } } export default Animator svg.js-3.2.4/src/animation/Controller.js000066400000000000000000000121201463723416200201650ustar00rootroot00000000000000import { timeline } from '../modules/core/defaults.js' import { extend } from '../utils/adopter.js' /*** Base Class ========== The base stepper class that will be ***/ function makeSetterGetter(k, f) { return function (v) { if (v == null) return this[k] this[k] = v if (f) f.call(this) return this } } export const easing = { '-': function (pos) { return pos }, '<>': function (pos) { return -Math.cos(pos * Math.PI) / 2 + 0.5 }, '>': function (pos) { return Math.sin((pos * Math.PI) / 2) }, '<': function (pos) { return -Math.cos((pos * Math.PI) / 2) + 1 }, bezier: function (x1, y1, x2, y2) { // see https://www.w3.org/TR/css-easing-1/#cubic-bezier-algo return function (t) { if (t < 0) { if (x1 > 0) { return (y1 / x1) * t } else if (x2 > 0) { return (y2 / x2) * t } else { return 0 } } else if (t > 1) { if (x2 < 1) { return ((1 - y2) / (1 - x2)) * t + (y2 - x2) / (1 - x2) } else if (x1 < 1) { return ((1 - y1) / (1 - x1)) * t + (y1 - x1) / (1 - x1) } else { return 1 } } else { return 3 * t * (1 - t) ** 2 * y1 + 3 * t ** 2 * (1 - t) * y2 + t ** 3 } } }, // see https://www.w3.org/TR/css-easing-1/#step-timing-function-algo steps: function (steps, stepPosition = 'end') { // deal with "jump-" prefix stepPosition = stepPosition.split('-').reverse()[0] let jumps = steps if (stepPosition === 'none') { --jumps } else if (stepPosition === 'both') { ++jumps } // The beforeFlag is essentially useless return (t, beforeFlag = false) => { // Step is called currentStep in referenced url let step = Math.floor(t * steps) const jumping = (t * step) % 1 === 0 if (stepPosition === 'start' || stepPosition === 'both') { ++step } if (beforeFlag && jumping) { --step } if (t >= 0 && step < 0) { step = 0 } if (t <= 1 && step > jumps) { step = jumps } return step / jumps } } } export class Stepper { done() { return false } } /*** Easing Functions ================ ***/ export class Ease extends Stepper { constructor(fn = timeline.ease) { super() this.ease = easing[fn] || fn } step(from, to, pos) { if (typeof from !== 'number') { return pos < 1 ? from : to } return from + (to - from) * this.ease(pos) } } /*** Controller Types ================ ***/ export class Controller extends Stepper { constructor(fn) { super() this.stepper = fn } done(c) { return c.done } step(current, target, dt, c) { return this.stepper(current, target, dt, c) } } function recalculate() { // Apply the default parameters const duration = (this._duration || 500) / 1000 const overshoot = this._overshoot || 0 // Calculate the PID natural response const eps = 1e-10 const pi = Math.PI const os = Math.log(overshoot / 100 + eps) const zeta = -os / Math.sqrt(pi * pi + os * os) const wn = 3.9 / (zeta * duration) // Calculate the Spring values this.d = 2 * zeta * wn this.k = wn * wn } export class Spring extends Controller { constructor(duration = 500, overshoot = 0) { super() this.duration(duration).overshoot(overshoot) } step(current, target, dt, c) { if (typeof current === 'string') return current c.done = dt === Infinity if (dt === Infinity) return target if (dt === 0) return current if (dt > 100) dt = 16 dt /= 1000 // Get the previous velocity const velocity = c.velocity || 0 // Apply the control to get the new position and store it const acceleration = -this.d * velocity - this.k * (current - target) const newPosition = current + velocity * dt + (acceleration * dt * dt) / 2 // Store the velocity c.velocity = velocity + acceleration * dt // Figure out if we have converged, and if so, pass the value c.done = Math.abs(target - newPosition) + Math.abs(velocity) < 0.002 return c.done ? target : newPosition } } extend(Spring, { duration: makeSetterGetter('_duration', recalculate), overshoot: makeSetterGetter('_overshoot', recalculate) }) export class PID extends Controller { constructor(p = 0.1, i = 0.01, d = 0, windup = 1000) { super() this.p(p).i(i).d(d).windup(windup) } step(current, target, dt, c) { if (typeof current === 'string') return current c.done = dt === Infinity if (dt === Infinity) return target if (dt === 0) return current const p = target - current let i = (c.integral || 0) + p * dt const d = (p - (c.error || 0)) / dt const windup = this._windup // antiwindup if (windup !== false) { i = Math.max(-windup, Math.min(i, windup)) } c.error = p c.integral = i c.done = Math.abs(p) < 0.001 return c.done ? target : current + (this.P * p + this.I * i + this.D * d) } } extend(PID, { windup: makeSetterGetter('_windup'), p: makeSetterGetter('P'), i: makeSetterGetter('I'), d: makeSetterGetter('D') }) svg.js-3.2.4/src/animation/Morphable.js000066400000000000000000000151561463723416200177670ustar00rootroot00000000000000import { Ease } from './Controller.js' import { delimiter, numberAndUnit, isPathLetter } from '../modules/core/regex.js' import { extend } from '../utils/adopter.js' import Color from '../types/Color.js' import PathArray from '../types/PathArray.js' import SVGArray from '../types/SVGArray.js' import SVGNumber from '../types/SVGNumber.js' const getClassForType = (value) => { const type = typeof value if (type === 'number') { return SVGNumber } else if (type === 'string') { if (Color.isColor(value)) { return Color } else if (delimiter.test(value)) { return isPathLetter.test(value) ? PathArray : SVGArray } else if (numberAndUnit.test(value)) { return SVGNumber } else { return NonMorphable } } else if (morphableTypes.indexOf(value.constructor) > -1) { return value.constructor } else if (Array.isArray(value)) { return SVGArray } else if (type === 'object') { return ObjectBag } else { return NonMorphable } } export default class Morphable { constructor(stepper) { this._stepper = stepper || new Ease('-') this._from = null this._to = null this._type = null this._context = null this._morphObj = null } at(pos) { return this._morphObj.morph( this._from, this._to, pos, this._stepper, this._context ) } done() { const complete = this._context.map(this._stepper.done).reduce(function ( last, curr ) { return last && curr }, true) return complete } from(val) { if (val == null) { return this._from } this._from = this._set(val) return this } stepper(stepper) { if (stepper == null) return this._stepper this._stepper = stepper return this } to(val) { if (val == null) { return this._to } this._to = this._set(val) return this } type(type) { // getter if (type == null) { return this._type } // setter this._type = type return this } _set(value) { if (!this._type) { this.type(getClassForType(value)) } let result = new this._type(value) if (this._type === Color) { result = this._to ? result[this._to[4]]() : this._from ? result[this._from[4]]() : result } if (this._type === ObjectBag) { result = this._to ? result.align(this._to) : this._from ? result.align(this._from) : result } result = result.toConsumable() this._morphObj = this._morphObj || new this._type() this._context = this._context || Array.apply(null, Array(result.length)) .map(Object) .map(function (o) { o.done = true return o }) return result } } export class NonMorphable { constructor(...args) { this.init(...args) } init(val) { val = Array.isArray(val) ? val[0] : val this.value = val return this } toArray() { return [this.value] } valueOf() { return this.value } } export class TransformBag { constructor(...args) { this.init(...args) } init(obj) { if (Array.isArray(obj)) { obj = { scaleX: obj[0], scaleY: obj[1], shear: obj[2], rotate: obj[3], translateX: obj[4], translateY: obj[5], originX: obj[6], originY: obj[7] } } Object.assign(this, TransformBag.defaults, obj) return this } toArray() { const v = this return [ v.scaleX, v.scaleY, v.shear, v.rotate, v.translateX, v.translateY, v.originX, v.originY ] } } TransformBag.defaults = { scaleX: 1, scaleY: 1, shear: 0, rotate: 0, translateX: 0, translateY: 0, originX: 0, originY: 0 } const sortByKey = (a, b) => { return a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0 } export class ObjectBag { constructor(...args) { this.init(...args) } align(other) { const values = this.values for (let i = 0, il = values.length; i < il; ++i) { // If the type is the same we only need to check if the color is in the correct format if (values[i + 1] === other[i + 1]) { if (values[i + 1] === Color && other[i + 7] !== values[i + 7]) { const space = other[i + 7] const color = new Color(this.values.splice(i + 3, 5)) [space]() .toArray() this.values.splice(i + 3, 0, ...color) } i += values[i + 2] + 2 continue } if (!other[i + 1]) { return this } // The types differ, so we overwrite the new type with the old one // And initialize it with the types default (e.g. black for color or 0 for number) const defaultObject = new other[i + 1]().toArray() // Than we fix the values array const toDelete = values[i + 2] + 3 values.splice( i, toDelete, other[i], other[i + 1], other[i + 2], ...defaultObject ) i += values[i + 2] + 2 } return this } init(objOrArr) { this.values = [] if (Array.isArray(objOrArr)) { this.values = objOrArr.slice() return } objOrArr = objOrArr || {} const entries = [] for (const i in objOrArr) { const Type = getClassForType(objOrArr[i]) const val = new Type(objOrArr[i]).toArray() entries.push([i, Type, val.length, ...val]) } entries.sort(sortByKey) this.values = entries.reduce((last, curr) => last.concat(curr), []) return this } toArray() { return this.values } valueOf() { const obj = {} const arr = this.values // for (var i = 0, len = arr.length; i < len; i += 2) { while (arr.length) { const key = arr.shift() const Type = arr.shift() const num = arr.shift() const values = arr.splice(0, num) obj[key] = new Type(values) // .valueOf() } return obj } } const morphableTypes = [NonMorphable, TransformBag, ObjectBag] export function registerMorphableType(type = []) { morphableTypes.push(...[].concat(type)) } export function makeMorphable() { extend(morphableTypes, { to(val) { return new Morphable() .type(this.constructor) .from(this.toArray()) // this.valueOf()) .to(val) }, fromArray(arr) { this.init(arr) return this }, toConsumable() { return this.toArray() }, morph(from, to, pos, stepper, context) { const mapper = function (i, index) { return stepper.step(i, to[index], pos, context[index], context) } return this.fromArray(from.map(mapper)) } }) } svg.js-3.2.4/src/animation/Queue.js000066400000000000000000000026421463723416200171360ustar00rootroot00000000000000export default class Queue { constructor() { this._first = null this._last = null } // Shows us the first item in the list first() { return this._first && this._first.value } // Shows us the last item in the list last() { return this._last && this._last.value } push(value) { // An item stores an id and the provided value const item = typeof value.next !== 'undefined' ? value : { value: value, next: null, prev: null } // Deal with the queue being empty or populated if (this._last) { item.prev = this._last this._last.next = item this._last = item } else { this._last = item this._first = item } // Return the current item return item } // Removes the item that was returned from the push remove(item) { // Relink the previous item if (item.prev) item.prev.next = item.next if (item.next) item.next.prev = item.prev if (item === this._last) this._last = item.prev if (item === this._first) this._first = item.next // Invalidate item item.prev = null item.next = null } shift() { // Check if we have a value const remove = this._first if (!remove) return null // If we do, remove it and relink things this._first = remove.next if (this._first) this._first.prev = null this._last = this._first ? this._last : null return remove.value } } svg.js-3.2.4/src/animation/Runner.js000066400000000000000000000704061463723416200173260ustar00rootroot00000000000000import { Controller, Ease, Stepper } from './Controller.js' import { extend, register } from '../utils/adopter.js' import { from, to } from '../modules/core/gradiented.js' import { getOrigin } from '../utils/utils.js' import { noop, timeline } from '../modules/core/defaults.js' import { registerMethods } from '../utils/methods.js' import { rx, ry } from '../modules/core/circled.js' import Animator from './Animator.js' import Box from '../types/Box.js' import EventTarget from '../types/EventTarget.js' import Matrix from '../types/Matrix.js' import Morphable, { TransformBag, ObjectBag } from './Morphable.js' import Point from '../types/Point.js' import SVGNumber from '../types/SVGNumber.js' import Timeline from './Timeline.js' export default class Runner extends EventTarget { constructor(options) { super() // Store a unique id on the runner, so that we can identify it later this.id = Runner.id++ // Ensure a default value options = options == null ? timeline.duration : options // Ensure that we get a controller options = typeof options === 'function' ? new Controller(options) : options // Declare all of the variables this._element = null this._timeline = null this.done = false this._queue = [] // Work out the stepper and the duration this._duration = typeof options === 'number' && options this._isDeclarative = options instanceof Controller this._stepper = this._isDeclarative ? options : new Ease() // We copy the current values from the timeline because they can change this._history = {} // Store the state of the runner this.enabled = true this._time = 0 this._lastTime = 0 // At creation, the runner is in reset state this._reseted = true // Save transforms applied to this runner this.transforms = new Matrix() this.transformId = 1 // Looping variables this._haveReversed = false this._reverse = false this._loopsDone = 0 this._swing = false this._wait = 0 this._times = 1 this._frameId = null // Stores how long a runner is stored after being done this._persist = this._isDeclarative ? true : null } static sanitise(duration, delay, when) { // Initialise the default parameters let times = 1 let swing = false let wait = 0 duration = duration ?? timeline.duration delay = delay ?? timeline.delay when = when || 'last' // If we have an object, unpack the values if (typeof duration === 'object' && !(duration instanceof Stepper)) { delay = duration.delay ?? delay when = duration.when ?? when swing = duration.swing || swing times = duration.times ?? times wait = duration.wait ?? wait duration = duration.duration ?? timeline.duration } return { duration: duration, delay: delay, swing: swing, times: times, wait: wait, when: when } } active(enabled) { if (enabled == null) return this.enabled this.enabled = enabled return this } /* Private Methods =============== Methods that shouldn't be used externally */ addTransform(transform) { this.transforms.lmultiplyO(transform) return this } after(fn) { return this.on('finished', fn) } animate(duration, delay, when) { const o = Runner.sanitise(duration, delay, when) const runner = new Runner(o.duration) if (this._timeline) runner.timeline(this._timeline) if (this._element) runner.element(this._element) return runner.loop(o).schedule(o.delay, o.when) } clearTransform() { this.transforms = new Matrix() return this } // TODO: Keep track of all transformations so that deletion is faster clearTransformsFromQueue() { if ( !this.done || !this._timeline || !this._timeline._runnerIds.includes(this.id) ) { this._queue = this._queue.filter((item) => { return !item.isTransform }) } } delay(delay) { return this.animate(0, delay) } duration() { return this._times * (this._wait + this._duration) - this._wait } during(fn) { return this.queue(null, fn) } ease(fn) { this._stepper = new Ease(fn) return this } /* Runner Definitions ================== These methods help us define the runtime behaviour of the Runner or they help us make new runners from the current runner */ element(element) { if (element == null) return this._element this._element = element element._prepareRunner() return this } finish() { return this.step(Infinity) } loop(times, swing, wait) { // Deal with the user passing in an object if (typeof times === 'object') { swing = times.swing wait = times.wait times = times.times } // Sanitise the values and store them this._times = times || Infinity this._swing = swing || false this._wait = wait || 0 // Allow true to be passed if (this._times === true) { this._times = Infinity } return this } loops(p) { const loopDuration = this._duration + this._wait if (p == null) { const loopsDone = Math.floor(this._time / loopDuration) const relativeTime = this._time - loopsDone * loopDuration const position = relativeTime / this._duration return Math.min(loopsDone + position, this._times) } const whole = Math.floor(p) const partial = p % 1 const time = loopDuration * whole + this._duration * partial return this.time(time) } persist(dtOrForever) { if (dtOrForever == null) return this._persist this._persist = dtOrForever return this } position(p) { // Get all of the variables we need const x = this._time const d = this._duration const w = this._wait const t = this._times const s = this._swing const r = this._reverse let position if (p == null) { /* This function converts a time to a position in the range [0, 1] The full explanation can be found in this desmos demonstration https://www.desmos.com/calculator/u4fbavgche The logic is slightly simplified here because we can use booleans */ // Figure out the value without thinking about the start or end time const f = function (x) { const swinging = s * Math.floor((x % (2 * (w + d))) / (w + d)) const backwards = (swinging && !r) || (!swinging && r) const uncliped = (Math.pow(-1, backwards) * (x % (w + d))) / d + backwards const clipped = Math.max(Math.min(uncliped, 1), 0) return clipped } // Figure out the value by incorporating the start time const endTime = t * (w + d) - w position = x <= 0 ? Math.round(f(1e-5)) : x < endTime ? f(x) : Math.round(f(endTime - 1e-5)) return position } // Work out the loops done and add the position to the loops done const loopsDone = Math.floor(this.loops()) const swingForward = s && loopsDone % 2 === 0 const forwards = (swingForward && !r) || (r && swingForward) position = loopsDone + (forwards ? p : 1 - p) return this.loops(position) } progress(p) { if (p == null) { return Math.min(1, this._time / this.duration()) } return this.time(p * this.duration()) } /* Basic Functionality =================== These methods allow us to attach basic functions to the runner directly */ queue(initFn, runFn, retargetFn, isTransform) { this._queue.push({ initialiser: initFn || noop, runner: runFn || noop, retarget: retargetFn, isTransform: isTransform, initialised: false, finished: false }) const timeline = this.timeline() timeline && this.timeline()._continue() return this } reset() { if (this._reseted) return this this.time(0) this._reseted = true return this } reverse(reverse) { this._reverse = reverse == null ? !this._reverse : reverse return this } schedule(timeline, delay, when) { // The user doesn't need to pass a timeline if we already have one if (!(timeline instanceof Timeline)) { when = delay delay = timeline timeline = this.timeline() } // If there is no timeline, yell at the user... if (!timeline) { throw Error('Runner cannot be scheduled without timeline') } // Schedule the runner on the timeline provided timeline.schedule(this, delay, when) return this } step(dt) { // If we are inactive, this stepper just gets skipped if (!this.enabled) return this // Update the time and get the new position dt = dt == null ? 16 : dt this._time += dt const position = this.position() // Figure out if we need to run the stepper in this frame const running = this._lastPosition !== position && this._time >= 0 this._lastPosition = position // Figure out if we just started const duration = this.duration() const justStarted = this._lastTime <= 0 && this._time > 0 const justFinished = this._lastTime < duration && this._time >= duration this._lastTime = this._time if (justStarted) { this.fire('start', this) } // Work out if the runner is finished set the done flag here so animations // know, that they are running in the last step (this is good for // transformations which can be merged) const declarative = this._isDeclarative this.done = !declarative && !justFinished && this._time >= duration // Runner is running. So its not in reset state anymore this._reseted = false let converged = false // Call initialise and the run function if (running || declarative) { this._initialise(running) // clear the transforms on this runner so they dont get added again and again this.transforms = new Matrix() converged = this._run(declarative ? dt : position) this.fire('step', this) } // correct the done flag here // declarative animations itself know when they converged this.done = this.done || (converged && declarative) if (justFinished) { this.fire('finished', this) } return this } /* Runner animation methods ======================== Control how the animation plays */ time(time) { if (time == null) { return this._time } const dt = time - this._time this.step(dt) return this } timeline(timeline) { // check explicitly for undefined so we can set the timeline to null if (typeof timeline === 'undefined') return this._timeline this._timeline = timeline return this } unschedule() { const timeline = this.timeline() timeline && timeline.unschedule(this) return this } // Run each initialise function in the runner if required _initialise(running) { // If we aren't running, we shouldn't initialise when not declarative if (!running && !this._isDeclarative) return // Loop through all of the initialisers for (let i = 0, len = this._queue.length; i < len; ++i) { // Get the current initialiser const current = this._queue[i] // Determine whether we need to initialise const needsIt = this._isDeclarative || (!current.initialised && running) running = !current.finished // Call the initialiser if we need to if (needsIt && running) { current.initialiser.call(this) current.initialised = true } } } // Save a morpher to the morpher list so that we can retarget it later _rememberMorpher(method, morpher) { this._history[method] = { morpher: morpher, caller: this._queue[this._queue.length - 1] } // We have to resume the timeline in case a controller // is already done without being ever run // This can happen when e.g. this is done: // anim = el.animate(new SVG.Spring) // and later // anim.move(...) if (this._isDeclarative) { const timeline = this.timeline() timeline && timeline.play() } } // Try to set the target for a morpher if the morpher exists, otherwise // Run each run function for the position or dt given _run(positionOrDt) { // Run all of the _queue directly let allfinished = true for (let i = 0, len = this._queue.length; i < len; ++i) { // Get the current function to run const current = this._queue[i] // Run the function if its not finished, we keep track of the finished // flag for the sake of declarative _queue const converged = current.runner.call(this, positionOrDt) current.finished = current.finished || converged === true allfinished = allfinished && current.finished } // We report when all of the constructors are finished return allfinished } // do nothing and return false _tryRetarget(method, target, extra) { if (this._history[method]) { // if the last method wasn't even initialised, throw it away if (!this._history[method].caller.initialised) { const index = this._queue.indexOf(this._history[method].caller) this._queue.splice(index, 1) return false } // for the case of transformations, we use the special retarget function // which has access to the outer scope if (this._history[method].caller.retarget) { this._history[method].caller.retarget.call(this, target, extra) // for everything else a simple morpher change is sufficient } else { this._history[method].morpher.to(target) } this._history[method].caller.finished = false const timeline = this.timeline() timeline && timeline.play() return true } return false } } Runner.id = 0 export class FakeRunner { constructor(transforms = new Matrix(), id = -1, done = true) { this.transforms = transforms this.id = id this.done = done } clearTransformsFromQueue() {} } extend([Runner, FakeRunner], { mergeWith(runner) { return new FakeRunner( runner.transforms.lmultiply(this.transforms), runner.id ) } }) // FakeRunner.emptyRunner = new FakeRunner() const lmultiply = (last, curr) => last.lmultiplyO(curr) const getRunnerTransform = (runner) => runner.transforms function mergeTransforms() { // Find the matrix to apply to the element and apply it const runners = this._transformationRunners.runners const netTransform = runners .map(getRunnerTransform) .reduce(lmultiply, new Matrix()) this.transform(netTransform) this._transformationRunners.merge() if (this._transformationRunners.length() === 1) { this._frameId = null } } export class RunnerArray { constructor() { this.runners = [] this.ids = [] } add(runner) { if (this.runners.includes(runner)) return const id = runner.id + 1 this.runners.push(runner) this.ids.push(id) return this } clearBefore(id) { const deleteCnt = this.ids.indexOf(id + 1) || 1 this.ids.splice(0, deleteCnt, 0) this.runners .splice(0, deleteCnt, new FakeRunner()) .forEach((r) => r.clearTransformsFromQueue()) return this } edit(id, newRunner) { const index = this.ids.indexOf(id + 1) this.ids.splice(index, 1, id + 1) this.runners.splice(index, 1, newRunner) return this } getByID(id) { return this.runners[this.ids.indexOf(id + 1)] } length() { return this.ids.length } merge() { let lastRunner = null for (let i = 0; i < this.runners.length; ++i) { const runner = this.runners[i] const condition = lastRunner && runner.done && lastRunner.done && // don't merge runner when persisted on timeline (!runner._timeline || !runner._timeline._runnerIds.includes(runner.id)) && (!lastRunner._timeline || !lastRunner._timeline._runnerIds.includes(lastRunner.id)) if (condition) { // the +1 happens in the function this.remove(runner.id) const newRunner = runner.mergeWith(lastRunner) this.edit(lastRunner.id, newRunner) lastRunner = newRunner --i } else { lastRunner = runner } } return this } remove(id) { const index = this.ids.indexOf(id + 1) this.ids.splice(index, 1) this.runners.splice(index, 1) return this } } registerMethods({ Element: { animate(duration, delay, when) { const o = Runner.sanitise(duration, delay, when) const timeline = this.timeline() return new Runner(o.duration) .loop(o) .element(this) .timeline(timeline.play()) .schedule(o.delay, o.when) }, delay(by, when) { return this.animate(0, by, when) }, // this function searches for all runners on the element and deletes the ones // which run before the current one. This is because absolute transformations // overwrite anything anyway so there is no need to waste time computing // other runners _clearTransformRunnersBefore(currentRunner) { this._transformationRunners.clearBefore(currentRunner.id) }, _currentTransform(current) { return ( this._transformationRunners.runners // we need the equal sign here to make sure, that also transformations // on the same runner which execute before the current transformation are // taken into account .filter((runner) => runner.id <= current.id) .map(getRunnerTransform) .reduce(lmultiply, new Matrix()) ) }, _addRunner(runner) { this._transformationRunners.add(runner) // Make sure that the runner merge is executed at the very end of // all Animator functions. That is why we use immediate here to execute // the merge right after all frames are run Animator.cancelImmediate(this._frameId) this._frameId = Animator.immediate(mergeTransforms.bind(this)) }, _prepareRunner() { if (this._frameId == null) { this._transformationRunners = new RunnerArray().add( new FakeRunner(new Matrix(this)) ) } } } }) // Will output the elements from array A that are not in the array B const difference = (a, b) => a.filter((x) => !b.includes(x)) extend(Runner, { attr(a, v) { return this.styleAttr('attr', a, v) }, // Add animatable styles css(s, v) { return this.styleAttr('css', s, v) }, styleAttr(type, nameOrAttrs, val) { if (typeof nameOrAttrs === 'string') { return this.styleAttr(type, { [nameOrAttrs]: val }) } let attrs = nameOrAttrs if (this._tryRetarget(type, attrs)) return this let morpher = new Morphable(this._stepper).to(attrs) let keys = Object.keys(attrs) this.queue( function () { morpher = morpher.from(this.element()[type](keys)) }, function (pos) { this.element()[type](morpher.at(pos).valueOf()) return morpher.done() }, function (newToAttrs) { // Check if any new keys were added const newKeys = Object.keys(newToAttrs) const differences = difference(newKeys, keys) // If their are new keys, initialize them and add them to morpher if (differences.length) { // Get the values const addedFromAttrs = this.element()[type](differences) // Get the already initialized values const oldFromAttrs = new ObjectBag(morpher.from()).valueOf() // Merge old and new Object.assign(oldFromAttrs, addedFromAttrs) morpher.from(oldFromAttrs) } // Get the object from the morpher const oldToAttrs = new ObjectBag(morpher.to()).valueOf() // Merge in new attributes Object.assign(oldToAttrs, newToAttrs) // Change morpher target morpher.to(oldToAttrs) // Make sure that we save the work we did so we don't need it to do again keys = newKeys attrs = newToAttrs } ) this._rememberMorpher(type, morpher) return this }, zoom(level, point) { if (this._tryRetarget('zoom', level, point)) return this let morpher = new Morphable(this._stepper).to(new SVGNumber(level)) this.queue( function () { morpher = morpher.from(this.element().zoom()) }, function (pos) { this.element().zoom(morpher.at(pos), point) return morpher.done() }, function (newLevel, newPoint) { point = newPoint morpher.to(newLevel) } ) this._rememberMorpher('zoom', morpher) return this }, /** ** absolute transformations **/ // // M v -----|-----(D M v = F v)------|-----> T v // // 1. define the final state (T) and decompose it (once) // t = [tx, ty, the, lam, sy, sx] // 2. on every frame: pull the current state of all previous transforms // (M - m can change) // and then write this as m = [tx0, ty0, the0, lam0, sy0, sx0] // 3. Find the interpolated matrix F(pos) = m + pos * (t - m) // - Note F(0) = M // - Note F(1) = T // 4. Now you get the delta matrix as a result: D = F * inv(M) transform(transforms, relative, affine) { // If we have a declarative function, we should retarget it if possible relative = transforms.relative || relative if ( this._isDeclarative && !relative && this._tryRetarget('transform', transforms) ) { return this } // Parse the parameters const isMatrix = Matrix.isMatrixLike(transforms) affine = transforms.affine != null ? transforms.affine : affine != null ? affine : !isMatrix // Create a morpher and set its type const morpher = new Morphable(this._stepper).type( affine ? TransformBag : Matrix ) let origin let element let current let currentAngle let startTransform function setup() { // make sure element and origin is defined element = element || this.element() origin = origin || getOrigin(transforms, element) startTransform = new Matrix(relative ? undefined : element) // add the runner to the element so it can merge transformations element._addRunner(this) // Deactivate all transforms that have run so far if we are absolute if (!relative) { element._clearTransformRunnersBefore(this) } } function run(pos) { // clear all other transforms before this in case something is saved // on this runner. We are absolute. We dont need these! if (!relative) this.clearTransform() const { x, y } = new Point(origin).transform( element._currentTransform(this) ) let target = new Matrix({ ...transforms, origin: [x, y] }) let start = this._isDeclarative && current ? current : startTransform if (affine) { target = target.decompose(x, y) start = start.decompose(x, y) // Get the current and target angle as it was set const rTarget = target.rotate const rCurrent = start.rotate // Figure out the shortest path to rotate directly const possibilities = [rTarget - 360, rTarget, rTarget + 360] const distances = possibilities.map((a) => Math.abs(a - rCurrent)) const shortest = Math.min(...distances) const index = distances.indexOf(shortest) target.rotate = possibilities[index] } if (relative) { // we have to be careful here not to overwrite the rotation // with the rotate method of Matrix if (!isMatrix) { target.rotate = transforms.rotate || 0 } if (this._isDeclarative && currentAngle) { start.rotate = currentAngle } } morpher.from(start) morpher.to(target) const affineParameters = morpher.at(pos) currentAngle = affineParameters.rotate current = new Matrix(affineParameters) this.addTransform(current) element._addRunner(this) return morpher.done() } function retarget(newTransforms) { // only get a new origin if it changed since the last call if ( (newTransforms.origin || 'center').toString() !== (transforms.origin || 'center').toString() ) { origin = getOrigin(newTransforms, element) } // overwrite the old transformations with the new ones transforms = { ...newTransforms, origin } } this.queue(setup, run, retarget, true) this._isDeclarative && this._rememberMorpher('transform', morpher) return this }, // Animatable x-axis x(x) { return this._queueNumber('x', x) }, // Animatable y-axis y(y) { return this._queueNumber('y', y) }, ax(x) { return this._queueNumber('ax', x) }, ay(y) { return this._queueNumber('ay', y) }, dx(x = 0) { return this._queueNumberDelta('x', x) }, dy(y = 0) { return this._queueNumberDelta('y', y) }, dmove(x, y) { return this.dx(x).dy(y) }, _queueNumberDelta(method, to) { to = new SVGNumber(to) // Try to change the target if we have this method already registered if (this._tryRetarget(method, to)) return this // Make a morpher and queue the animation const morpher = new Morphable(this._stepper).to(to) let from = null this.queue( function () { from = this.element()[method]() morpher.from(from) morpher.to(from + to) }, function (pos) { this.element()[method](morpher.at(pos)) return morpher.done() }, function (newTo) { morpher.to(from + new SVGNumber(newTo)) } ) // Register the morpher so that if it is changed again, we can retarget it this._rememberMorpher(method, morpher) return this }, _queueObject(method, to) { // Try to change the target if we have this method already registered if (this._tryRetarget(method, to)) return this // Make a morpher and queue the animation const morpher = new Morphable(this._stepper).to(to) this.queue( function () { morpher.from(this.element()[method]()) }, function (pos) { this.element()[method](morpher.at(pos)) return morpher.done() } ) // Register the morpher so that if it is changed again, we can retarget it this._rememberMorpher(method, morpher) return this }, _queueNumber(method, value) { return this._queueObject(method, new SVGNumber(value)) }, // Animatable center x-axis cx(x) { return this._queueNumber('cx', x) }, // Animatable center y-axis cy(y) { return this._queueNumber('cy', y) }, // Add animatable move move(x, y) { return this.x(x).y(y) }, amove(x, y) { return this.ax(x).ay(y) }, // Add animatable center center(x, y) { return this.cx(x).cy(y) }, // Add animatable size size(width, height) { // animate bbox based size for all other elements let box if (!width || !height) { box = this._element.bbox() } if (!width) { width = (box.width / box.height) * height } if (!height) { height = (box.height / box.width) * width } return this.width(width).height(height) }, // Add animatable width width(width) { return this._queueNumber('width', width) }, // Add animatable height height(height) { return this._queueNumber('height', height) }, // Add animatable plot plot(a, b, c, d) { // Lines can be plotted with 4 arguments if (arguments.length === 4) { return this.plot([a, b, c, d]) } if (this._tryRetarget('plot', a)) return this const morpher = new Morphable(this._stepper) .type(this._element.MorphArray) .to(a) this.queue( function () { morpher.from(this._element.array()) }, function (pos) { this._element.plot(morpher.at(pos)) return morpher.done() } ) this._rememberMorpher('plot', morpher) return this }, // Add leading method leading(value) { return this._queueNumber('leading', value) }, // Add animatable viewbox viewbox(x, y, width, height) { return this._queueObject('viewbox', new Box(x, y, width, height)) }, update(o) { if (typeof o !== 'object') { return this.update({ offset: arguments[0], color: arguments[1], opacity: arguments[2] }) } if (o.opacity != null) this.attr('stop-opacity', o.opacity) if (o.color != null) this.attr('stop-color', o.color) if (o.offset != null) this.attr('offset', o.offset) return this } }) extend(Runner, { rx, ry, from, to }) register(Runner, 'Runner') svg.js-3.2.4/src/animation/Timeline.js000066400000000000000000000226641463723416200176260ustar00rootroot00000000000000import { globals } from '../utils/window.js' import { registerMethods } from '../utils/methods.js' import Animator from './Animator.js' import EventTarget from '../types/EventTarget.js' const makeSchedule = function (runnerInfo) { const start = runnerInfo.start const duration = runnerInfo.runner.duration() const end = start + duration return { start: start, duration: duration, end: end, runner: runnerInfo.runner } } const defaultSource = function () { const w = globals.window return (w.performance || w.Date).now() } export default class Timeline extends EventTarget { // Construct a new timeline on the given element constructor(timeSource = defaultSource) { super() this._timeSource = timeSource // terminate resets all variables to their initial state this.terminate() } active() { return !!this._nextFrame } finish() { // Go to end and pause this.time(this.getEndTimeOfTimeline() + 1) return this.pause() } // Calculates the end of the timeline getEndTime() { const lastRunnerInfo = this.getLastRunnerInfo() const lastDuration = lastRunnerInfo ? lastRunnerInfo.runner.duration() : 0 const lastStartTime = lastRunnerInfo ? lastRunnerInfo.start : this._time return lastStartTime + lastDuration } getEndTimeOfTimeline() { const endTimes = this._runners.map((i) => i.start + i.runner.duration()) return Math.max(0, ...endTimes) } getLastRunnerInfo() { return this.getRunnerInfoById(this._lastRunnerId) } getRunnerInfoById(id) { return this._runners[this._runnerIds.indexOf(id)] || null } pause() { this._paused = true return this._continue() } persist(dtOrForever) { if (dtOrForever == null) return this._persist this._persist = dtOrForever return this } play() { // Now make sure we are not paused and continue the animation this._paused = false return this.updateTime()._continue() } reverse(yes) { const currentSpeed = this.speed() if (yes == null) return this.speed(-currentSpeed) const positive = Math.abs(currentSpeed) return this.speed(yes ? -positive : positive) } // schedules a runner on the timeline schedule(runner, delay, when) { if (runner == null) { return this._runners.map(makeSchedule) } // The start time for the next animation can either be given explicitly, // derived from the current timeline time or it can be relative to the // last start time to chain animations directly let absoluteStartTime = 0 const endTime = this.getEndTime() delay = delay || 0 // Work out when to start the animation if (when == null || when === 'last' || when === 'after') { // Take the last time and increment absoluteStartTime = endTime } else if (when === 'absolute' || when === 'start') { absoluteStartTime = delay delay = 0 } else if (when === 'now') { absoluteStartTime = this._time } else if (when === 'relative') { const runnerInfo = this.getRunnerInfoById(runner.id) if (runnerInfo) { absoluteStartTime = runnerInfo.start + delay delay = 0 } } else if (when === 'with-last') { const lastRunnerInfo = this.getLastRunnerInfo() const lastStartTime = lastRunnerInfo ? lastRunnerInfo.start : this._time absoluteStartTime = lastStartTime } else { throw new Error('Invalid value for the "when" parameter') } // Manage runner runner.unschedule() runner.timeline(this) const persist = runner.persist() const runnerInfo = { persist: persist === null ? this._persist : persist, start: absoluteStartTime + delay, runner } this._lastRunnerId = runner.id this._runners.push(runnerInfo) this._runners.sort((a, b) => a.start - b.start) this._runnerIds = this._runners.map((info) => info.runner.id) this.updateTime()._continue() return this } seek(dt) { return this.time(this._time + dt) } source(fn) { if (fn == null) return this._timeSource this._timeSource = fn return this } speed(speed) { if (speed == null) return this._speed this._speed = speed return this } stop() { // Go to start and pause this.time(0) return this.pause() } time(time) { if (time == null) return this._time this._time = time return this._continue(true) } // Remove the runner from this timeline unschedule(runner) { const index = this._runnerIds.indexOf(runner.id) if (index < 0) return this this._runners.splice(index, 1) this._runnerIds.splice(index, 1) runner.timeline(null) return this } // Makes sure, that after pausing the time doesn't jump updateTime() { if (!this.active()) { this._lastSourceTime = this._timeSource() } return this } // Checks if we are running and continues the animation _continue(immediateStep = false) { Animator.cancelFrame(this._nextFrame) this._nextFrame = null if (immediateStep) return this._stepImmediate() if (this._paused) return this this._nextFrame = Animator.frame(this._step) return this } _stepFn(immediateStep = false) { // Get the time delta from the last time and update the time const time = this._timeSource() let dtSource = time - this._lastSourceTime if (immediateStep) dtSource = 0 const dtTime = this._speed * dtSource + (this._time - this._lastStepTime) this._lastSourceTime = time // Only update the time if we use the timeSource. // Otherwise use the current time if (!immediateStep) { // Update the time this._time += dtTime this._time = this._time < 0 ? 0 : this._time } this._lastStepTime = this._time this.fire('time', this._time) // This is for the case that the timeline was seeked so that the time // is now before the startTime of the runner. That is why we need to set // the runner to position 0 // FIXME: // However, resetting in insertion order leads to bugs. Considering the case, // where 2 runners change the same attribute but in different times, // resetting both of them will lead to the case where the later defined // runner always wins the reset even if the other runner started earlier // and therefore should win the attribute battle // this can be solved by resetting them backwards for (let k = this._runners.length; k--; ) { // Get and run the current runner and ignore it if its inactive const runnerInfo = this._runners[k] const runner = runnerInfo.runner // Make sure that we give the actual difference // between runner start time and now const dtToStart = this._time - runnerInfo.start // Dont run runner if not started yet // and try to reset it if (dtToStart <= 0) { runner.reset() } } // Run all of the runners directly let runnersLeft = false for (let i = 0, len = this._runners.length; i < len; i++) { // Get and run the current runner and ignore it if its inactive const runnerInfo = this._runners[i] const runner = runnerInfo.runner let dt = dtTime // Make sure that we give the actual difference // between runner start time and now const dtToStart = this._time - runnerInfo.start // Dont run runner if not started yet if (dtToStart <= 0) { runnersLeft = true continue } else if (dtToStart < dt) { // Adjust dt to make sure that animation is on point dt = dtToStart } if (!runner.active()) continue // If this runner is still going, signal that we need another animation // frame, otherwise, remove the completed runner const finished = runner.step(dt).done if (!finished) { runnersLeft = true // continue } else if (runnerInfo.persist !== true) { // runner is finished. And runner might get removed const endTime = runner.duration() - runner.time() + this._time if (endTime + runnerInfo.persist < this._time) { // Delete runner and correct index runner.unschedule() --i --len } } } // Basically: we continue when there are runners right from us in time // when -->, and when runners are left from us when <-- if ( (runnersLeft && !(this._speed < 0 && this._time === 0)) || (this._runnerIds.length && this._speed < 0 && this._time > 0) ) { this._continue() } else { this.pause() this.fire('finished') } return this } terminate() { // cleanup memory // Store the timing variables this._startTime = 0 this._speed = 1.0 // Determines how long a runner is hold in memory. Can be a dt or true/false this._persist = 0 // Keep track of the running animations and their starting parameters this._nextFrame = null this._paused = true this._runners = [] this._runnerIds = [] this._lastRunnerId = -1 this._time = 0 this._lastSourceTime = 0 this._lastStepTime = 0 // Make sure that step is always called in class context this._step = this._stepFn.bind(this, false) this._stepImmediate = this._stepFn.bind(this, true) } } registerMethods({ Element: { timeline: function (timeline) { if (timeline == null) { this._timeline = this._timeline || new Timeline() return this._timeline } else { this._timeline = timeline return this } } } }) svg.js-3.2.4/src/elements/000077500000000000000000000000001463723416200153455ustar00rootroot00000000000000svg.js-3.2.4/src/elements/A.js000066400000000000000000000030601463723416200160620ustar00rootroot00000000000000import { nodeOrNew, register, wrapWithAttrCheck, extend } from '../utils/adopter.js' import { registerMethods } from '../utils/methods.js' import { xlink } from '../modules/core/namespaces.js' import Container from './Container.js' import * as containerGeometry from '../modules/core/containerGeometry.js' export default class A extends Container { constructor(node, attrs = node) { super(nodeOrNew('a', node), attrs) } // Link target attribute target(target) { return this.attr('target', target) } // Link url to(url) { return this.attr('href', url, xlink) } } extend(A, containerGeometry) registerMethods({ Container: { // Create a hyperlink element link: wrapWithAttrCheck(function (url) { return this.put(new A()).to(url) }) }, Element: { unlink() { const link = this.linker() if (!link) return this const parent = link.parent() if (!parent) { return this.remove() } const index = parent.index(link) parent.add(this, index) link.remove() return this }, linkTo(url) { // reuse old link if possible let link = this.linker() if (!link) { link = new A() this.wrap(link) } if (typeof url === 'function') { url.call(link, link) } else { link.to(url) } return this }, linker() { const link = this.parent() if (link && link.node.nodeName.toLowerCase() === 'a') { return link } return null } } }) register(A, 'A') svg.js-3.2.4/src/elements/Circle.js000066400000000000000000000016611463723416200171100ustar00rootroot00000000000000import { cx, cy, height, width, x, y } from '../modules/core/circled.js' import { extend, nodeOrNew, register, wrapWithAttrCheck } from '../utils/adopter.js' import { registerMethods } from '../utils/methods.js' import SVGNumber from '../types/SVGNumber.js' import Shape from './Shape.js' export default class Circle extends Shape { constructor(node, attrs = node) { super(nodeOrNew('circle', node), attrs) } radius(r) { return this.attr('r', r) } // Radius x value rx(rx) { return this.attr('r', rx) } // Alias radius x value ry(ry) { return this.rx(ry) } size(size) { return this.radius(new SVGNumber(size).divide(2)) } } extend(Circle, { x, y, cx, cy, width, height }) registerMethods({ Container: { // Create circle element circle: wrapWithAttrCheck(function (size = 0) { return this.put(new Circle()).size(size).move(0, 0) }) } }) register(Circle, 'Circle') svg.js-3.2.4/src/elements/ClipPath.js000066400000000000000000000025151463723416200174120ustar00rootroot00000000000000import { nodeOrNew, register, wrapWithAttrCheck } from '../utils/adopter.js' import { registerMethods } from '../utils/methods.js' import Container from './Container.js' import baseFind from '../modules/core/selector.js' export default class ClipPath extends Container { constructor(node, attrs = node) { super(nodeOrNew('clipPath', node), attrs) } // Unclip all clipped elements and remove itself remove() { // unclip all targets this.targets().forEach(function (el) { el.unclip() }) // remove clipPath from parent return super.remove() } targets() { return baseFind('svg [clip-path*=' + this.id() + ']') } } registerMethods({ Container: { // Create clipping element clip: wrapWithAttrCheck(function () { return this.defs().put(new ClipPath()) }) }, Element: { // Distribute clipPath to svg element clipper() { return this.reference('clip-path') }, clipWith(element) { // use given clip or create a new one const clipper = element instanceof ClipPath ? element : this.parent().clip().add(element) // apply mask return this.attr('clip-path', 'url(#' + clipper.id() + ')') }, // Unclip element unclip() { return this.attr('clip-path', null) } } }) register(ClipPath, 'ClipPath') svg.js-3.2.4/src/elements/Container.js000066400000000000000000000012571463723416200176320ustar00rootroot00000000000000import { register } from '../utils/adopter.js' import Element from './Element.js' export default class Container extends Element { flatten() { this.each(function () { if (this instanceof Container) { return this.flatten().ungroup() } }) return this } ungroup(parent = this.parent(), index = parent.index(this)) { // when parent != this, we want append all elements to the end index = index === -1 ? parent.children().length : index this.each(function (i, children) { // reverse each return children[children.length - i - 1].toParent(parent, index) }) return this.remove() } } register(Container, 'Container') svg.js-3.2.4/src/elements/Defs.js000066400000000000000000000005021463723416200165610ustar00rootroot00000000000000import { nodeOrNew, register } from '../utils/adopter.js' import Container from './Container.js' export default class Defs extends Container { constructor(node, attrs = node) { super(nodeOrNew('defs', node), attrs) } flatten() { return this } ungroup() { return this } } register(Defs, 'Defs') svg.js-3.2.4/src/elements/Dom.js000066400000000000000000000200001463723416200164120ustar00rootroot00000000000000import { adopt, assignNewId, eid, extend, makeInstance, create, register } from '../utils/adopter.js' import { find, findOne } from '../modules/core/selector.js' import { globals } from '../utils/window.js' import { map } from '../utils/utils.js' import { svg, html } from '../modules/core/namespaces.js' import EventTarget from '../types/EventTarget.js' import List from '../types/List.js' import attr from '../modules/core/attr.js' export default class Dom extends EventTarget { constructor(node, attrs) { super() this.node = node this.type = node.nodeName if (attrs && node !== attrs) { this.attr(attrs) } } // Add given element at a position add(element, i) { element = makeInstance(element) // If non-root svg nodes are added we have to remove their namespaces if ( element.removeNamespace && this.node instanceof globals.window.SVGElement ) { element.removeNamespace() } if (i == null) { this.node.appendChild(element.node) } else if (element.node !== this.node.childNodes[i]) { this.node.insertBefore(element.node, this.node.childNodes[i]) } return this } // Add element to given container and return self addTo(parent, i) { return makeInstance(parent).put(this, i) } // Returns all child elements children() { return new List( map(this.node.children, function (node) { return adopt(node) }) ) } // Remove all elements in this container clear() { // remove children while (this.node.hasChildNodes()) { this.node.removeChild(this.node.lastChild) } return this } // Clone element clone(deep = true, assignNewIds = true) { // write dom data to the dom so the clone can pickup the data this.writeDataToDom() // clone element let nodeClone = this.node.cloneNode(deep) if (assignNewIds) { // assign new id nodeClone = assignNewId(nodeClone) } return new this.constructor(nodeClone) } // Iterates over all children and invokes a given block each(block, deep) { const children = this.children() let i, il for (i = 0, il = children.length; i < il; i++) { block.apply(children[i], [i, children]) if (deep) { children[i].each(block, deep) } } return this } element(nodeName, attrs) { return this.put(new Dom(create(nodeName), attrs)) } // Get first child first() { return adopt(this.node.firstChild) } // Get a element at the given index get(i) { return adopt(this.node.childNodes[i]) } getEventHolder() { return this.node } getEventTarget() { return this.node } // Checks if the given element is a child has(element) { return this.index(element) >= 0 } html(htmlOrFn, outerHTML) { return this.xml(htmlOrFn, outerHTML, html) } // Get / set id id(id) { // generate new id if no id set if (typeof id === 'undefined' && !this.node.id) { this.node.id = eid(this.type) } // don't set directly with this.node.id to make `null` work correctly return this.attr('id', id) } // Gets index of given element index(element) { return [].slice.call(this.node.childNodes).indexOf(element.node) } // Get the last child last() { return adopt(this.node.lastChild) } // matches the element vs a css selector matches(selector) { const el = this.node const matcher = el.matches || el.matchesSelector || el.msMatchesSelector || el.mozMatchesSelector || el.webkitMatchesSelector || el.oMatchesSelector || null return matcher && matcher.call(el, selector) } // Returns the parent element instance parent(type) { let parent = this // check for parent if (!parent.node.parentNode) return null // get parent element parent = adopt(parent.node.parentNode) if (!type) return parent // loop through ancestors if type is given do { if ( typeof type === 'string' ? parent.matches(type) : parent instanceof type ) return parent } while ((parent = adopt(parent.node.parentNode))) return parent } // Basically does the same as `add()` but returns the added element instead put(element, i) { element = makeInstance(element) this.add(element, i) return element } // Add element to given container and return container putIn(parent, i) { return makeInstance(parent).add(this, i) } // Remove element remove() { if (this.parent()) { this.parent().removeElement(this) } return this } // Remove a given child removeElement(element) { this.node.removeChild(element.node) return this } // Replace this with element replace(element) { element = makeInstance(element) if (this.node.parentNode) { this.node.parentNode.replaceChild(element.node, this.node) } return element } round(precision = 2, map = null) { const factor = 10 ** precision const attrs = this.attr(map) for (const i in attrs) { if (typeof attrs[i] === 'number') { attrs[i] = Math.round(attrs[i] * factor) / factor } } this.attr(attrs) return this } // Import / Export raw svg svg(svgOrFn, outerSVG) { return this.xml(svgOrFn, outerSVG, svg) } // Return id on string conversion toString() { return this.id() } words(text) { // This is faster than removing all children and adding a new one this.node.textContent = text return this } wrap(node) { const parent = this.parent() if (!parent) { return this.addTo(node) } const position = parent.index(this) return parent.put(node, position).put(this) } // write svgjs data to the dom writeDataToDom() { // dump variables recursively this.each(function () { this.writeDataToDom() }) return this } // Import / Export raw svg xml(xmlOrFn, outerXML, ns) { if (typeof xmlOrFn === 'boolean') { ns = outerXML outerXML = xmlOrFn xmlOrFn = null } // act as getter if no svg string is given if (xmlOrFn == null || typeof xmlOrFn === 'function') { // The default for exports is, that the outerNode is included outerXML = outerXML == null ? true : outerXML // write svgjs data to the dom this.writeDataToDom() let current = this // An export modifier was passed if (xmlOrFn != null) { current = adopt(current.node.cloneNode(true)) // If the user wants outerHTML we need to process this node, too if (outerXML) { const result = xmlOrFn(current) current = result || current // The user does not want this node? Well, then he gets nothing if (result === false) return '' } // Deep loop through all children and apply modifier current.each(function () { const result = xmlOrFn(this) const _this = result || this // If modifier returns false, discard node if (result === false) { this.remove() // If modifier returns new node, use it } else if (result && this !== _this) { this.replace(_this) } }, true) } // Return outer or inner content return outerXML ? current.node.outerHTML : current.node.innerHTML } // Act as setter if we got a string // The default for import is, that the current node is not replaced outerXML = outerXML == null ? false : outerXML // Create temporary holder const well = create('wrapper', ns) const fragment = globals.document.createDocumentFragment() // Dump raw svg well.innerHTML = xmlOrFn // Transplant nodes into the fragment for (let len = well.children.length; len--; ) { fragment.appendChild(well.firstElementChild) } const parent = this.parent() // Add the whole fragment at once return outerXML ? this.replace(fragment) && parent : this.add(fragment) } } extend(Dom, { attr, find, findOne }) register(Dom, 'Dom') svg.js-3.2.4/src/elements/Element.js000066400000000000000000000074141463723416200173020ustar00rootroot00000000000000import { bbox, rbox, inside } from '../types/Box.js' import { ctm, screenCTM } from '../types/Matrix.js' import { extend, getClass, makeInstance, register, root } from '../utils/adopter.js' import { globals } from '../utils/window.js' import { point } from '../types/Point.js' import { proportionalSize, writeDataToDom } from '../utils/utils.js' import { reference } from '../modules/core/regex.js' import Dom from './Dom.js' import List from '../types/List.js' import SVGNumber from '../types/SVGNumber.js' export default class Element extends Dom { constructor(node, attrs) { super(node, attrs) // initialize data object this.dom = {} // create circular reference this.node.instance = this if (node.hasAttribute('data-svgjs') || node.hasAttribute('svgjs:data')) { // pull svgjs data from the dom (getAttributeNS doesn't work in html5) this.setData( JSON.parse(node.getAttribute('data-svgjs')) ?? JSON.parse(node.getAttribute('svgjs:data')) ?? {} ) } } // Move element by its center center(x, y) { return this.cx(x).cy(y) } // Move by center over x-axis cx(x) { return x == null ? this.x() + this.width() / 2 : this.x(x - this.width() / 2) } // Move by center over y-axis cy(y) { return y == null ? this.y() + this.height() / 2 : this.y(y - this.height() / 2) } // Get defs defs() { const root = this.root() return root && root.defs() } // Relative move over x and y axes dmove(x, y) { return this.dx(x).dy(y) } // Relative move over x axis dx(x = 0) { return this.x(new SVGNumber(x).plus(this.x())) } // Relative move over y axis dy(y = 0) { return this.y(new SVGNumber(y).plus(this.y())) } getEventHolder() { return this } // Set height of element height(height) { return this.attr('height', height) } // Move element to given x and y values move(x, y) { return this.x(x).y(y) } // return array of all ancestors of given type up to the root svg parents(until = this.root()) { const isSelector = typeof until === 'string' if (!isSelector) { until = makeInstance(until) } const parents = new List() let parent = this while ( (parent = parent.parent()) && parent.node !== globals.document && parent.nodeName !== '#document-fragment' ) { parents.push(parent) if (!isSelector && parent.node === until.node) { break } if (isSelector && parent.matches(until)) { break } if (parent.node === this.root().node) { // We worked our way to the root and didn't match `until` return null } } return parents } // Get referenced element form attribute value reference(attr) { attr = this.attr(attr) if (!attr) return null const m = (attr + '').match(reference) return m ? makeInstance(m[1]) : null } // Get parent document root() { const p = this.parent(getClass(root)) return p && p.root() } // set given data to the elements data property setData(o) { this.dom = o return this } // Set element size to given width and height size(width, height) { const p = proportionalSize(this, width, height) return this.width(new SVGNumber(p.width)).height(new SVGNumber(p.height)) } // Set width of element width(width) { return this.attr('width', width) } // write svgjs data to the dom writeDataToDom() { writeDataToDom(this, this.dom) return super.writeDataToDom() } // Move over x-axis x(x) { return this.attr('x', x) } // Move over y-axis y(y) { return this.attr('y', y) } } extend(Element, { bbox, rbox, inside, point, ctm, screenCTM }) register(Element, 'Element') svg.js-3.2.4/src/elements/Ellipse.js000066400000000000000000000016061463723416200173030ustar00rootroot00000000000000import { extend, nodeOrNew, register, wrapWithAttrCheck } from '../utils/adopter.js' import { proportionalSize } from '../utils/utils.js' import { registerMethods } from '../utils/methods.js' import SVGNumber from '../types/SVGNumber.js' import Shape from './Shape.js' import * as circled from '../modules/core/circled.js' export default class Ellipse extends Shape { constructor(node, attrs = node) { super(nodeOrNew('ellipse', node), attrs) } size(width, height) { const p = proportionalSize(this, width, height) return this.rx(new SVGNumber(p.width).divide(2)).ry( new SVGNumber(p.height).divide(2) ) } } extend(Ellipse, circled) registerMethods('Container', { // Create an ellipse ellipse: wrapWithAttrCheck(function (width = 0, height = width) { return this.put(new Ellipse()).size(width, height).move(0, 0) }) }) register(Ellipse, 'Ellipse') svg.js-3.2.4/src/elements/ForeignObject.js000066400000000000000000000010221463723416200204160ustar00rootroot00000000000000import { nodeOrNew, register, wrapWithAttrCheck } from '../utils/adopter.js' import { registerMethods } from '../utils/methods.js' import Element from './Element.js' export default class ForeignObject extends Element { constructor(node, attrs = node) { super(nodeOrNew('foreignObject', node), attrs) } } registerMethods({ Container: { foreignObject: wrapWithAttrCheck(function (width, height) { return this.put(new ForeignObject()).size(width, height) }) } }) register(ForeignObject, 'ForeignObject') svg.js-3.2.4/src/elements/Fragment.js000066400000000000000000000015741463723416200174550ustar00rootroot00000000000000import Dom from './Dom.js' import { globals } from '../utils/window.js' import { register, create } from '../utils/adopter.js' class Fragment extends Dom { constructor(node = globals.document.createDocumentFragment()) { super(node) } // Import / Export raw xml xml(xmlOrFn, outerXML, ns) { if (typeof xmlOrFn === 'boolean') { ns = outerXML outerXML = xmlOrFn xmlOrFn = null } // because this is a fragment we have to put all elements into a wrapper first // before we can get the innerXML from it if (xmlOrFn == null || typeof xmlOrFn === 'function') { const wrapper = new Dom(create('wrapper', ns)) wrapper.add(this.node.cloneNode(true)) return wrapper.xml(false, ns) } // Act as setter if we got a string return super.xml(xmlOrFn, false, ns) } } register(Fragment, 'Fragment') export default Fragment svg.js-3.2.4/src/elements/G.js000066400000000000000000000011111463723416200160630ustar00rootroot00000000000000import { nodeOrNew, register, wrapWithAttrCheck, extend } from '../utils/adopter.js' import { registerMethods } from '../utils/methods.js' import Container from './Container.js' import * as containerGeometry from '../modules/core/containerGeometry.js' export default class G extends Container { constructor(node, attrs = node) { super(nodeOrNew('g', node), attrs) } } extend(G, containerGeometry) registerMethods({ Container: { // Create a group element group: wrapWithAttrCheck(function () { return this.put(new G()) }) } }) register(G, 'G') svg.js-3.2.4/src/elements/Gradient.js000066400000000000000000000027371463723416200174510ustar00rootroot00000000000000import { extend, nodeOrNew, register, wrapWithAttrCheck } from '../utils/adopter.js' import { registerMethods } from '../utils/methods.js' import Box from '../types/Box.js' import Container from './Container.js' import baseFind from '../modules/core/selector.js' import * as gradiented from '../modules/core/gradiented.js' export default class Gradient extends Container { constructor(type, attrs) { super( nodeOrNew(type + 'Gradient', typeof type === 'string' ? null : type), attrs ) } // custom attr to handle transform attr(a, b, c) { if (a === 'transform') a = 'gradientTransform' return super.attr(a, b, c) } bbox() { return new Box() } targets() { return baseFind('svg [fill*=' + this.id() + ']') } // Alias string conversion to fill toString() { return this.url() } // Update gradient update(block) { // remove all stops this.clear() // invoke passed block if (typeof block === 'function') { block.call(this, this) } return this } // Return the fill id url() { return 'url(#' + this.id() + ')' } } extend(Gradient, gradiented) registerMethods({ Container: { // Create gradient element in defs gradient(...args) { return this.defs().gradient(...args) } }, // define gradient Defs: { gradient: wrapWithAttrCheck(function (type, block) { return this.put(new Gradient(type)).update(block) }) } }) register(Gradient, 'Gradient') svg.js-3.2.4/src/elements/Image.js000066400000000000000000000040351463723416200167270ustar00rootroot00000000000000import { isImage } from '../modules/core/regex.js' import { nodeOrNew, register, wrapWithAttrCheck } from '../utils/adopter.js' import { off, on } from '../modules/core/event.js' import { registerAttrHook } from '../modules/core/attr.js' import { registerMethods } from '../utils/methods.js' import { xlink } from '../modules/core/namespaces.js' import Pattern from './Pattern.js' import Shape from './Shape.js' import { globals } from '../utils/window.js' export default class Image extends Shape { constructor(node, attrs = node) { super(nodeOrNew('image', node), attrs) } // (re)load image load(url, callback) { if (!url) return this const img = new globals.window.Image() on( img, 'load', function (e) { const p = this.parent(Pattern) // ensure image size if (this.width() === 0 && this.height() === 0) { this.size(img.width, img.height) } if (p instanceof Pattern) { // ensure pattern size if not set if (p.width() === 0 && p.height() === 0) { p.size(this.width(), this.height()) } } if (typeof callback === 'function') { callback.call(this, e) } }, this ) on(img, 'load error', function () { // dont forget to unbind memory leaking events off(img) }) return this.attr('href', (img.src = url), xlink) } } registerAttrHook(function (attr, val, _this) { // convert image fill and stroke to patterns if (attr === 'fill' || attr === 'stroke') { if (isImage.test(val)) { val = _this.root().defs().image(val) } } if (val instanceof Image) { val = _this .root() .defs() .pattern(0, 0, (pattern) => { pattern.add(val) }) } return val }) registerMethods({ Container: { // create image element, load image and set its size image: wrapWithAttrCheck(function (source, callback) { return this.put(new Image()).size(0, 0).load(source, callback) }) } }) register(Image, 'Image') svg.js-3.2.4/src/elements/Line.js000066400000000000000000000031471463723416200165770ustar00rootroot00000000000000import { extend, nodeOrNew, register, wrapWithAttrCheck } from '../utils/adopter.js' import { proportionalSize } from '../utils/utils.js' import { registerMethods } from '../utils/methods.js' import PointArray from '../types/PointArray.js' import Shape from './Shape.js' import * as pointed from '../modules/core/pointed.js' export default class Line extends Shape { // Initialize node constructor(node, attrs = node) { super(nodeOrNew('line', node), attrs) } // Get array array() { return new PointArray([ [this.attr('x1'), this.attr('y1')], [this.attr('x2'), this.attr('y2')] ]) } // Move by left top corner move(x, y) { return this.attr(this.array().move(x, y).toLine()) } // Overwrite native plot() method plot(x1, y1, x2, y2) { if (x1 == null) { return this.array() } else if (typeof y1 !== 'undefined') { x1 = { x1, y1, x2, y2 } } else { x1 = new PointArray(x1).toLine() } return this.attr(x1) } // Set element size to given width and height size(width, height) { const p = proportionalSize(this, width, height) return this.attr(this.array().size(p.width, p.height).toLine()) } } extend(Line, pointed) registerMethods({ Container: { // Create a line element line: wrapWithAttrCheck(function (...args) { // make sure plot is called as a setter // x1 is not necessarily a number, it can also be an array, a string and a PointArray return Line.prototype.plot.apply( this.put(new Line()), args[0] != null ? args : [0, 0, 0, 0] ) }) } }) register(Line, 'Line') svg.js-3.2.4/src/elements/Marker.js000066400000000000000000000036651463723416200171360ustar00rootroot00000000000000import { nodeOrNew, register, wrapWithAttrCheck } from '../utils/adopter.js' import { registerMethods } from '../utils/methods.js' import Container from './Container.js' export default class Marker extends Container { // Initialize node constructor(node, attrs = node) { super(nodeOrNew('marker', node), attrs) } // Set height of element height(height) { return this.attr('markerHeight', height) } orient(orient) { return this.attr('orient', orient) } // Set marker refX and refY ref(x, y) { return this.attr('refX', x).attr('refY', y) } // Return the fill id toString() { return 'url(#' + this.id() + ')' } // Update marker update(block) { // remove all content this.clear() // invoke passed block if (typeof block === 'function') { block.call(this, this) } return this } // Set width of element width(width) { return this.attr('markerWidth', width) } } registerMethods({ Container: { marker(...args) { // Create marker element in defs return this.defs().marker(...args) } }, Defs: { // Create marker marker: wrapWithAttrCheck(function (width, height, block) { // Set default viewbox to match the width and height, set ref to cx and cy and set orient to auto return this.put(new Marker()) .size(width, height) .ref(width / 2, height / 2) .viewbox(0, 0, width, height) .attr('orient', 'auto') .update(block) }) }, marker: { // Create and attach markers marker(marker, width, height, block) { let attr = ['marker'] // Build attribute name if (marker !== 'all') attr.push(marker) attr = attr.join('-') // Set marker attribute marker = arguments[1] instanceof Marker ? arguments[1] : this.defs().marker(width, height, block) return this.attr(attr, marker) } } }) register(Marker, 'Marker') svg.js-3.2.4/src/elements/Mask.js000066400000000000000000000023671463723416200166060ustar00rootroot00000000000000import { nodeOrNew, register, wrapWithAttrCheck } from '../utils/adopter.js' import { registerMethods } from '../utils/methods.js' import Container from './Container.js' import baseFind from '../modules/core/selector.js' export default class Mask extends Container { // Initialize node constructor(node, attrs = node) { super(nodeOrNew('mask', node), attrs) } // Unmask all masked elements and remove itself remove() { // unmask all targets this.targets().forEach(function (el) { el.unmask() }) // remove mask from parent return super.remove() } targets() { return baseFind('svg [mask*=' + this.id() + ']') } } registerMethods({ Container: { mask: wrapWithAttrCheck(function () { return this.defs().put(new Mask()) }) }, Element: { // Distribute mask to svg element masker() { return this.reference('mask') }, maskWith(element) { // use given mask or create a new one const masker = element instanceof Mask ? element : this.parent().mask().add(element) // apply mask return this.attr('mask', 'url(#' + masker.id() + ')') }, // Unmask element unmask() { return this.attr('mask', null) } } }) register(Mask, 'Mask') svg.js-3.2.4/src/elements/Path.js000066400000000000000000000036601463723416200166040ustar00rootroot00000000000000import { nodeOrNew, register, wrapWithAttrCheck } from '../utils/adopter.js' import { proportionalSize } from '../utils/utils.js' import { registerMethods } from '../utils/methods.js' import PathArray from '../types/PathArray.js' import Shape from './Shape.js' export default class Path extends Shape { // Initialize node constructor(node, attrs = node) { super(nodeOrNew('path', node), attrs) } // Get array array() { return this._array || (this._array = new PathArray(this.attr('d'))) } // Clear array cache clear() { delete this._array return this } // Set height of element height(height) { return height == null ? this.bbox().height : this.size(this.bbox().width, height) } // Move by left top corner move(x, y) { return this.attr('d', this.array().move(x, y)) } // Plot new path plot(d) { return d == null ? this.array() : this.clear().attr( 'd', typeof d === 'string' ? d : (this._array = new PathArray(d)) ) } // Set element size to given width and height size(width, height) { const p = proportionalSize(this, width, height) return this.attr('d', this.array().size(p.width, p.height)) } // Set width of element width(width) { return width == null ? this.bbox().width : this.size(width, this.bbox().height) } // Move by left top corner over x-axis x(x) { return x == null ? this.bbox().x : this.move(x, this.bbox().y) } // Move by left top corner over y-axis y(y) { return y == null ? this.bbox().y : this.move(this.bbox().x, y) } } // Define morphable array Path.prototype.MorphArray = PathArray // Add parent method registerMethods({ Container: { // Create a wrapped path element path: wrapWithAttrCheck(function (d) { // make sure plot is called as a setter return this.put(new Path()).plot(d || new PathArray()) }) } }) register(Path, 'Path') svg.js-3.2.4/src/elements/Pattern.js000066400000000000000000000027101463723416200173200ustar00rootroot00000000000000import { nodeOrNew, register, wrapWithAttrCheck } from '../utils/adopter.js' import { registerMethods } from '../utils/methods.js' import Box from '../types/Box.js' import Container from './Container.js' import baseFind from '../modules/core/selector.js' export default class Pattern extends Container { // Initialize node constructor(node, attrs = node) { super(nodeOrNew('pattern', node), attrs) } // custom attr to handle transform attr(a, b, c) { if (a === 'transform') a = 'patternTransform' return super.attr(a, b, c) } bbox() { return new Box() } targets() { return baseFind('svg [fill*=' + this.id() + ']') } // Alias string conversion to fill toString() { return this.url() } // Update pattern by rebuilding update(block) { // remove content this.clear() // invoke passed block if (typeof block === 'function') { block.call(this, this) } return this } // Return the fill id url() { return 'url(#' + this.id() + ')' } } registerMethods({ Container: { // Create pattern element in defs pattern(...args) { return this.defs().pattern(...args) } }, Defs: { pattern: wrapWithAttrCheck(function (width, height, block) { return this.put(new Pattern()).update(block).attr({ x: 0, y: 0, width: width, height: height, patternUnits: 'userSpaceOnUse' }) }) } }) register(Pattern, 'Pattern') svg.js-3.2.4/src/elements/Polygon.js000066400000000000000000000014441463723416200173350ustar00rootroot00000000000000import { extend, nodeOrNew, register, wrapWithAttrCheck } from '../utils/adopter.js' import { registerMethods } from '../utils/methods.js' import PointArray from '../types/PointArray.js' import Shape from './Shape.js' import * as pointed from '../modules/core/pointed.js' import * as poly from '../modules/core/poly.js' export default class Polygon extends Shape { // Initialize node constructor(node, attrs = node) { super(nodeOrNew('polygon', node), attrs) } } registerMethods({ Container: { // Create a wrapped polygon element polygon: wrapWithAttrCheck(function (p) { // make sure plot is called as a setter return this.put(new Polygon()).plot(p || new PointArray()) }) } }) extend(Polygon, pointed) extend(Polygon, poly) register(Polygon, 'Polygon') svg.js-3.2.4/src/elements/Polyline.js000066400000000000000000000014541463723416200175020ustar00rootroot00000000000000import { extend, nodeOrNew, register, wrapWithAttrCheck } from '../utils/adopter.js' import { registerMethods } from '../utils/methods.js' import PointArray from '../types/PointArray.js' import Shape from './Shape.js' import * as pointed from '../modules/core/pointed.js' import * as poly from '../modules/core/poly.js' export default class Polyline extends Shape { // Initialize node constructor(node, attrs = node) { super(nodeOrNew('polyline', node), attrs) } } registerMethods({ Container: { // Create a wrapped polygon element polyline: wrapWithAttrCheck(function (p) { // make sure plot is called as a setter return this.put(new Polyline()).plot(p || new PointArray()) }) } }) extend(Polyline, pointed) extend(Polyline, poly) register(Polyline, 'Polyline') svg.js-3.2.4/src/elements/Rect.js000066400000000000000000000011461463723416200166020ustar00rootroot00000000000000import { extend, nodeOrNew, register, wrapWithAttrCheck } from '../utils/adopter.js' import { registerMethods } from '../utils/methods.js' import { rx, ry } from '../modules/core/circled.js' import Shape from './Shape.js' export default class Rect extends Shape { // Initialize node constructor(node, attrs = node) { super(nodeOrNew('rect', node), attrs) } } extend(Rect, { rx, ry }) registerMethods({ Container: { // Create a rect element rect: wrapWithAttrCheck(function (width, height) { return this.put(new Rect()).size(width, height) }) } }) register(Rect, 'Rect') svg.js-3.2.4/src/elements/Shape.js000066400000000000000000000002331463723416200167410ustar00rootroot00000000000000import { register } from '../utils/adopter.js' import Element from './Element.js' export default class Shape extends Element {} register(Shape, 'Shape') svg.js-3.2.4/src/elements/Stop.js000066400000000000000000000017161463723416200166350ustar00rootroot00000000000000import { nodeOrNew, register } from '../utils/adopter.js' import Element from './Element.js' import SVGNumber from '../types/SVGNumber.js' import { registerMethods } from '../utils/methods.js' export default class Stop extends Element { constructor(node, attrs = node) { super(nodeOrNew('stop', node), attrs) } // add color stops update(o) { if (typeof o === 'number' || o instanceof SVGNumber) { o = { offset: arguments[0], color: arguments[1], opacity: arguments[2] } } // set attributes if (o.opacity != null) this.attr('stop-opacity', o.opacity) if (o.color != null) this.attr('stop-color', o.color) if (o.offset != null) this.attr('offset', new SVGNumber(o.offset)) return this } } registerMethods({ Gradient: { // Add a color stop stop: function (offset, color, opacity) { return this.put(new Stop()).update(offset, color, opacity) } } }) register(Stop, 'Stop') svg.js-3.2.4/src/elements/Style.js000066400000000000000000000020611463723416200170020ustar00rootroot00000000000000import { nodeOrNew, register } from '../utils/adopter.js' import { registerMethods } from '../utils/methods.js' import { unCamelCase } from '../utils/utils.js' import Element from './Element.js' function cssRule(selector, rule) { if (!selector) return '' if (!rule) return selector let ret = selector + '{' for (const i in rule) { ret += unCamelCase(i) + ':' + rule[i] + ';' } ret += '}' return ret } export default class Style extends Element { constructor(node, attrs = node) { super(nodeOrNew('style', node), attrs) } addText(w = '') { this.node.textContent += w return this } font(name, src, params = {}) { return this.rule('@font-face', { fontFamily: name, src: src, ...params }) } rule(selector, obj) { return this.addText(cssRule(selector, obj)) } } registerMethods('Dom', { style(selector, obj) { return this.put(new Style()).rule(selector, obj) }, fontface(name, src, params) { return this.put(new Style()).font(name, src, params) } }) register(Style, 'Style') svg.js-3.2.4/src/elements/Svg.js000066400000000000000000000030321463723416200164400ustar00rootroot00000000000000import { adopt, nodeOrNew, register, wrapWithAttrCheck } from '../utils/adopter.js' import { svg, xlink, xmlns } from '../modules/core/namespaces.js' import { registerMethods } from '../utils/methods.js' import Container from './Container.js' import Defs from './Defs.js' import { globals } from '../utils/window.js' export default class Svg extends Container { constructor(node, attrs = node) { super(nodeOrNew('svg', node), attrs) this.namespace() } // Creates and returns defs element defs() { if (!this.isRoot()) return this.root().defs() return adopt(this.node.querySelector('defs')) || this.put(new Defs()) } isRoot() { return ( !this.node.parentNode || (!(this.node.parentNode instanceof globals.window.SVGElement) && this.node.parentNode.nodeName !== '#document-fragment') ) } // Add namespaces namespace() { if (!this.isRoot()) return this.root().namespace() return this.attr({ xmlns: svg, version: '1.1' }).attr( 'xmlns:xlink', xlink, xmlns ) } removeNamespace() { return this.attr({ xmlns: null, version: null }) .attr('xmlns:xlink', null, xmlns) .attr('xmlns:svgjs', null, xmlns) } // Check if this is a root svg // If not, call root() from this element root() { if (this.isRoot()) return this return super.root() } } registerMethods({ Container: { // Create nested svg document nested: wrapWithAttrCheck(function () { return this.put(new Svg()) }) } }) register(Svg, 'Svg', true) svg.js-3.2.4/src/elements/Symbol.js000066400000000000000000000007421463723416200171530ustar00rootroot00000000000000import { nodeOrNew, register, wrapWithAttrCheck } from '../utils/adopter.js' import { registerMethods } from '../utils/methods.js' import Container from './Container.js' export default class Symbol extends Container { // Initialize node constructor(node, attrs = node) { super(nodeOrNew('symbol', node), attrs) } } registerMethods({ Container: { symbol: wrapWithAttrCheck(function () { return this.put(new Symbol()) }) } }) register(Symbol, 'Symbol') svg.js-3.2.4/src/elements/Text.js000066400000000000000000000073411463723416200166340ustar00rootroot00000000000000import { adopt, extend, nodeOrNew, register, wrapWithAttrCheck } from '../utils/adopter.js' import { registerMethods } from '../utils/methods.js' import SVGNumber from '../types/SVGNumber.js' import Shape from './Shape.js' import { globals } from '../utils/window.js' import * as textable from '../modules/core/textable.js' import { isDescriptive, writeDataToDom } from '../utils/utils.js' export default class Text extends Shape { // Initialize node constructor(node, attrs = node) { super(nodeOrNew('text', node), attrs) this.dom.leading = this.dom.leading ?? new SVGNumber(1.3) // store leading value for rebuilding this._rebuild = true // enable automatic updating of dy values this._build = false // disable build mode for adding multiple lines } // Set / get leading leading(value) { // act as getter if (value == null) { return this.dom.leading } // act as setter this.dom.leading = new SVGNumber(value) return this.rebuild() } // Rebuild appearance type rebuild(rebuild) { // store new rebuild flag if given if (typeof rebuild === 'boolean') { this._rebuild = rebuild } // define position of all lines if (this._rebuild) { const self = this let blankLineOffset = 0 const leading = this.dom.leading this.each(function (i) { if (isDescriptive(this.node)) return const fontSize = globals.window .getComputedStyle(this.node) .getPropertyValue('font-size') const dy = leading * new SVGNumber(fontSize) if (this.dom.newLined) { this.attr('x', self.attr('x')) if (this.text() === '\n') { blankLineOffset += dy } else { this.attr('dy', i ? dy + blankLineOffset : 0) blankLineOffset = 0 } } }) this.fire('rebuild') } return this } // overwrite method from parent to set data properly setData(o) { this.dom = o this.dom.leading = new SVGNumber(o.leading || 1.3) return this } writeDataToDom() { writeDataToDom(this, this.dom, { leading: 1.3 }) return this } // Set the text content text(text) { // act as getter if (text === undefined) { const children = this.node.childNodes let firstLine = 0 text = '' for (let i = 0, len = children.length; i < len; ++i) { // skip textPaths - they are no lines if (children[i].nodeName === 'textPath' || isDescriptive(children[i])) { if (i === 0) firstLine = i + 1 continue } // add newline if its not the first child and newLined is set to true if ( i !== firstLine && children[i].nodeType !== 3 && adopt(children[i]).dom.newLined === true ) { text += '\n' } // add content of this node text += children[i].textContent } return text } // remove existing content this.clear().build(true) if (typeof text === 'function') { // call block text.call(this, this) } else { // store text and make sure text is not blank text = (text + '').split('\n') // build new lines for (let j = 0, jl = text.length; j < jl; j++) { this.newLine(text[j]) } } // disable build mode and rebuild lines return this.build(false).rebuild() } } extend(Text, textable) registerMethods({ Container: { // Create text element text: wrapWithAttrCheck(function (text = '') { return this.put(new Text()).text(text) }), // Create plain text element plain: wrapWithAttrCheck(function (text = '') { return this.put(new Text()).plain(text) }) } }) register(Text, 'Text') svg.js-3.2.4/src/elements/TextPath.js000066400000000000000000000051501463723416200174450ustar00rootroot00000000000000import { nodeOrNew, register, wrapWithAttrCheck } from '../utils/adopter.js' import { registerMethods } from '../utils/methods.js' import { xlink } from '../modules/core/namespaces.js' import Path from './Path.js' import PathArray from '../types/PathArray.js' import Text from './Text.js' import baseFind from '../modules/core/selector.js' export default class TextPath extends Text { // Initialize node constructor(node, attrs = node) { super(nodeOrNew('textPath', node), attrs) } // return the array of the path track element array() { const track = this.track() return track ? track.array() : null } // Plot path if any plot(d) { const track = this.track() let pathArray = null if (track) { pathArray = track.plot(d) } return d == null ? pathArray : this } // Get the path element track() { return this.reference('href') } } registerMethods({ Container: { textPath: wrapWithAttrCheck(function (text, path) { // Convert text to instance if needed if (!(text instanceof Text)) { text = this.text(text) } return text.path(path) }) }, Text: { // Create path for text to run on path: wrapWithAttrCheck(function (track, importNodes = true) { const textPath = new TextPath() // if track is a path, reuse it if (!(track instanceof Path)) { // create path element track = this.defs().path(track) } // link textPath to path and add content textPath.attr('href', '#' + track, xlink) // Transplant all nodes from text to textPath let node if (importNodes) { while ((node = this.node.firstChild)) { textPath.node.appendChild(node) } } // add textPath element as child node and return textPath return this.put(textPath) }), // Get the textPath children textPath() { return this.findOne('textPath') } }, Path: { // creates a textPath from this path text: wrapWithAttrCheck(function (text) { // Convert text to instance if needed if (!(text instanceof Text)) { text = new Text().addTo(this.parent()).text(text) } // Create textPath from text and path and return return text.path(this) }), targets() { return baseFind('svg textPath').filter((node) => { return (node.attr('href') || '').includes(this.id()) }) // Does not work in IE11. Use when IE support is dropped // return baseFind('svg textPath[*|href*=' + this.id() + ']') } } }) TextPath.prototype.MorphArray = PathArray register(TextPath, 'TextPath') svg.js-3.2.4/src/elements/Tspan.js000066400000000000000000000037071463723416200167770ustar00rootroot00000000000000import { extend, nodeOrNew, register, wrapWithAttrCheck } from '../utils/adopter.js' import { globals } from '../utils/window.js' import { registerMethods } from '../utils/methods.js' import SVGNumber from '../types/SVGNumber.js' import Shape from './Shape.js' import Text from './Text.js' import * as textable from '../modules/core/textable.js' export default class Tspan extends Shape { // Initialize node constructor(node, attrs = node) { super(nodeOrNew('tspan', node), attrs) this._build = false // disable build mode for adding multiple lines } // Shortcut dx dx(dx) { return this.attr('dx', dx) } // Shortcut dy dy(dy) { return this.attr('dy', dy) } // Create new line newLine() { // mark new line this.dom.newLined = true // fetch parent const text = this.parent() // early return in case we are not in a text element if (!(text instanceof Text)) { return this } const i = text.index(this) const fontSize = globals.window .getComputedStyle(this.node) .getPropertyValue('font-size') const dy = text.dom.leading * new SVGNumber(fontSize) // apply new position return this.dy(i ? dy : 0).attr('x', text.x()) } // Set text content text(text) { if (text == null) return this.node.textContent + (this.dom.newLined ? '\n' : '') if (typeof text === 'function') { this.clear().build(true) text.call(this, this) this.build(false) } else { this.plain(text) } return this } } extend(Tspan, textable) registerMethods({ Tspan: { tspan: wrapWithAttrCheck(function (text = '') { const tspan = new Tspan() // clear if build mode is disabled if (!this._build) { this.clear() } // add new tspan return this.put(tspan).text(text) }) }, Text: { newLine: function (text = '') { return this.tspan(text).newLine() } } }) register(Tspan, 'Tspan') svg.js-3.2.4/src/elements/Use.js000066400000000000000000000012701463723416200164370ustar00rootroot00000000000000import { nodeOrNew, register, wrapWithAttrCheck } from '../utils/adopter.js' import { registerMethods } from '../utils/methods.js' import { xlink } from '../modules/core/namespaces.js' import Shape from './Shape.js' export default class Use extends Shape { constructor(node, attrs = node) { super(nodeOrNew('use', node), attrs) } // Use element as a reference use(element, file) { // Set lined element return this.attr('href', (file || '') + '#' + element, xlink) } } registerMethods({ Container: { // Create a use element use: wrapWithAttrCheck(function (element, file) { return this.put(new Use()).use(element, file) }) } }) register(Use, 'Use') svg.js-3.2.4/src/main.js000066400000000000000000000135501463723416200150170ustar00rootroot00000000000000/* Optional Modules */ import './modules/optional/arrange.js' import './modules/optional/class.js' import './modules/optional/css.js' import './modules/optional/data.js' import './modules/optional/memory.js' import './modules/optional/sugar.js' import './modules/optional/transform.js' import { extend, makeInstance } from './utils/adopter.js' import { getMethodNames, getMethodsFor } from './utils/methods.js' import Box from './types/Box.js' import Color from './types/Color.js' import Container from './elements/Container.js' import Defs from './elements/Defs.js' import Dom from './elements/Dom.js' import Element from './elements/Element.js' import Ellipse from './elements/Ellipse.js' import EventTarget from './types/EventTarget.js' import Fragment from './elements/Fragment.js' import Gradient from './elements/Gradient.js' import Image from './elements/Image.js' import Line from './elements/Line.js' import List from './types/List.js' import Marker from './elements/Marker.js' import Matrix from './types/Matrix.js' import Morphable, { NonMorphable, ObjectBag, TransformBag, makeMorphable, registerMorphableType } from './animation/Morphable.js' import Path from './elements/Path.js' import PathArray from './types/PathArray.js' import Pattern from './elements/Pattern.js' import PointArray from './types/PointArray.js' import Point from './types/Point.js' import Polygon from './elements/Polygon.js' import Polyline from './elements/Polyline.js' import Rect from './elements/Rect.js' import Runner from './animation/Runner.js' import SVGArray from './types/SVGArray.js' import SVGNumber from './types/SVGNumber.js' import Shape from './elements/Shape.js' import Svg from './elements/Svg.js' import Symbol from './elements/Symbol.js' import Text from './elements/Text.js' import Tspan from './elements/Tspan.js' import * as defaults from './modules/core/defaults.js' import * as utils from './utils/utils.js' import * as namespaces from './modules/core/namespaces.js' import * as regex from './modules/core/regex.js' export { Morphable, registerMorphableType, makeMorphable, TransformBag, ObjectBag, NonMorphable } export { defaults, utils, namespaces, regex } export const SVG = makeInstance export { default as parser } from './modules/core/parser.js' export { default as find } from './modules/core/selector.js' export * from './modules/core/event.js' export * from './utils/adopter.js' export { getWindow, registerWindow, restoreWindow, saveWindow, withWindow } from './utils/window.js' /* Animation Modules */ export { default as Animator } from './animation/Animator.js' export { Controller, Ease, PID, Spring, easing } from './animation/Controller.js' export { default as Queue } from './animation/Queue.js' export { default as Runner } from './animation/Runner.js' export { default as Timeline } from './animation/Timeline.js' /* Types */ export { default as Array } from './types/SVGArray.js' export { default as Box } from './types/Box.js' export { default as Color } from './types/Color.js' export { default as EventTarget } from './types/EventTarget.js' export { default as Matrix } from './types/Matrix.js' export { default as Number } from './types/SVGNumber.js' export { default as PathArray } from './types/PathArray.js' export { default as Point } from './types/Point.js' export { default as PointArray } from './types/PointArray.js' export { default as List } from './types/List.js' /* Elements */ export { default as Circle } from './elements/Circle.js' export { default as ClipPath } from './elements/ClipPath.js' export { default as Container } from './elements/Container.js' export { default as Defs } from './elements/Defs.js' export { default as Dom } from './elements/Dom.js' export { default as Element } from './elements/Element.js' export { default as Ellipse } from './elements/Ellipse.js' export { default as ForeignObject } from './elements/ForeignObject.js' export { default as Fragment } from './elements/Fragment.js' export { default as Gradient } from './elements/Gradient.js' export { default as G } from './elements/G.js' export { default as A } from './elements/A.js' export { default as Image } from './elements/Image.js' export { default as Line } from './elements/Line.js' export { default as Marker } from './elements/Marker.js' export { default as Mask } from './elements/Mask.js' export { default as Path } from './elements/Path.js' export { default as Pattern } from './elements/Pattern.js' export { default as Polygon } from './elements/Polygon.js' export { default as Polyline } from './elements/Polyline.js' export { default as Rect } from './elements/Rect.js' export { default as Shape } from './elements/Shape.js' export { default as Stop } from './elements/Stop.js' export { default as Style } from './elements/Style.js' export { default as Svg } from './elements/Svg.js' export { default as Symbol } from './elements/Symbol.js' export { default as Text } from './elements/Text.js' export { default as TextPath } from './elements/TextPath.js' export { default as Tspan } from './elements/Tspan.js' export { default as Use } from './elements/Use.js' extend([Svg, Symbol, Image, Pattern, Marker], getMethodsFor('viewbox')) extend([Line, Polyline, Polygon, Path], getMethodsFor('marker')) extend(Text, getMethodsFor('Text')) extend(Path, getMethodsFor('Path')) extend(Defs, getMethodsFor('Defs')) extend([Text, Tspan], getMethodsFor('Tspan')) extend([Rect, Ellipse, Gradient, Runner], getMethodsFor('radius')) extend(EventTarget, getMethodsFor('EventTarget')) extend(Dom, getMethodsFor('Dom')) extend(Element, getMethodsFor('Element')) extend(Shape, getMethodsFor('Shape')) extend([Container, Fragment], getMethodsFor('Container')) extend(Gradient, getMethodsFor('Gradient')) extend(Runner, getMethodsFor('Runner')) List.extend(getMethodNames()) registerMorphableType([ SVGNumber, Color, Box, Matrix, SVGArray, PointArray, PathArray, Point ]) makeMorphable() svg.js-3.2.4/src/modules/000077500000000000000000000000001463723416200152015ustar00rootroot00000000000000svg.js-3.2.4/src/modules/core/000077500000000000000000000000001463723416200161315ustar00rootroot00000000000000svg.js-3.2.4/src/modules/core/attr.js000066400000000000000000000050511463723416200174420ustar00rootroot00000000000000import { attrs as defaults } from './defaults.js' import { isNumber } from './regex.js' import Color from '../../types/Color.js' import SVGArray from '../../types/SVGArray.js' import SVGNumber from '../../types/SVGNumber.js' const colorAttributes = new Set([ 'fill', 'stroke', 'color', 'bgcolor', 'stop-color', 'flood-color', 'lighting-color' ]) const hooks = [] export function registerAttrHook(fn) { hooks.push(fn) } // Set svg element attribute export default function attr(attr, val, ns) { // act as full getter if (attr == null) { // get an object of attributes attr = {} val = this.node.attributes for (const node of val) { attr[node.nodeName] = isNumber.test(node.nodeValue) ? parseFloat(node.nodeValue) : node.nodeValue } return attr } else if (attr instanceof Array) { // loop through array and get all values return attr.reduce((last, curr) => { last[curr] = this.attr(curr) return last }, {}) } else if (typeof attr === 'object' && attr.constructor === Object) { // apply every attribute individually if an object is passed for (val in attr) this.attr(val, attr[val]) } else if (val === null) { // remove value this.node.removeAttribute(attr) } else if (val == null) { // act as a getter if the first and only argument is not an object val = this.node.getAttribute(attr) return val == null ? defaults[attr] : isNumber.test(val) ? parseFloat(val) : val } else { // Loop through hooks and execute them to convert value val = hooks.reduce((_val, hook) => { return hook(attr, _val, this) }, val) // ensure correct numeric values (also accepts NaN and Infinity) if (typeof val === 'number') { val = new SVGNumber(val) } else if (colorAttributes.has(attr) && Color.isColor(val)) { // ensure full hex color val = new Color(val) } else if (val.constructor === Array) { // Check for plain arrays and parse array values val = new SVGArray(val) } // if the passed attribute is leading... if (attr === 'leading') { // ... call the leading method instead if (this.leading) { this.leading(val) } } else { // set given attribute on node typeof ns === 'string' ? this.node.setAttributeNS(ns, attr, val.toString()) : this.node.setAttribute(attr, val.toString()) } // rebuild if required if (this.rebuild && (attr === 'font-size' || attr === 'x')) { this.rebuild() } } return this } svg.js-3.2.4/src/modules/core/circled.js000066400000000000000000000015701463723416200200770ustar00rootroot00000000000000import SVGNumber from '../../types/SVGNumber.js' // Radius x value export function rx(rx) { return this.attr('rx', rx) } // Radius y value export function ry(ry) { return this.attr('ry', ry) } // Move over x-axis export function x(x) { return x == null ? this.cx() - this.rx() : this.cx(x + this.rx()) } // Move over y-axis export function y(y) { return y == null ? this.cy() - this.ry() : this.cy(y + this.ry()) } // Move by center over x-axis export function cx(x) { return this.attr('cx', x) } // Move by center over y-axis export function cy(y) { return this.attr('cy', y) } // Set width of element export function width(width) { return width == null ? this.rx() * 2 : this.rx(new SVGNumber(width).divide(2)) } // Set height of element export function height(height) { return height == null ? this.ry() * 2 : this.ry(new SVGNumber(height).divide(2)) } svg.js-3.2.4/src/modules/core/containerGeometry.js000066400000000000000000000051201463723416200221630ustar00rootroot00000000000000import Matrix from '../../types/Matrix.js' import Point from '../../types/Point.js' import Box from '../../types/Box.js' import { proportionalSize } from '../../utils/utils.js' import { getWindow } from '../../utils/window.js' export function dmove(dx, dy) { this.children().forEach((child) => { let bbox // We have to wrap this for elements that dont have a bbox // e.g. title and other descriptive elements try { // Get the childs bbox // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1905039 // Because bbox for nested svgs returns the contents bbox in the coordinate space of the svg itself (weird!), we cant use bbox for svgs // Therefore we have to use getBoundingClientRect. But THAT is broken (as explained in the bug). // Funnily enough the broken behavior would work for us but that breaks it in chrome // So we have to replicate the broken behavior of FF by just reading the attributes of the svg itself bbox = child.node instanceof getWindow().SVGSVGElement ? new Box(child.attr(['x', 'y', 'width', 'height'])) : child.bbox() } catch (e) { return } // Get childs matrix const m = new Matrix(child) // Translate childs matrix by amount and // transform it back into parents space const matrix = m.translate(dx, dy).transform(m.inverse()) // Calculate new x and y from old box const p = new Point(bbox.x, bbox.y).transform(matrix) // Move element child.move(p.x, p.y) }) return this } export function dx(dx) { return this.dmove(dx, 0) } export function dy(dy) { return this.dmove(0, dy) } export function height(height, box = this.bbox()) { if (height == null) return box.height return this.size(box.width, height, box) } export function move(x = 0, y = 0, box = this.bbox()) { const dx = x - box.x const dy = y - box.y return this.dmove(dx, dy) } export function size(width, height, box = this.bbox()) { const p = proportionalSize(this, width, height, box) const scaleX = p.width / box.width const scaleY = p.height / box.height this.children().forEach((child) => { const o = new Point(box).transform(new Matrix(child).inverse()) child.scale(scaleX, scaleY, o.x, o.y) }) return this } export function width(width, box = this.bbox()) { if (width == null) return box.width return this.size(width, box.height, box) } export function x(x, box = this.bbox()) { if (x == null) return box.x return this.move(x, box.y, box) } export function y(y, box = this.bbox()) { if (y == null) return box.y return this.move(box.x, y, box) } svg.js-3.2.4/src/modules/core/defaults.js000066400000000000000000000011441463723416200202760ustar00rootroot00000000000000export function noop() {} // Default animation values export const timeline = { duration: 400, ease: '>', delay: 0 } // Default attribute values export const attrs = { // fill and stroke 'fill-opacity': 1, 'stroke-opacity': 1, 'stroke-width': 0, 'stroke-linejoin': 'miter', 'stroke-linecap': 'butt', fill: '#000000', stroke: '#000000', opacity: 1, // position x: 0, y: 0, cx: 0, cy: 0, // size width: 0, height: 0, // radius r: 0, rx: 0, ry: 0, // gradient offset: 0, 'stop-opacity': 1, 'stop-color': '#000000', // text 'text-anchor': 'start' } svg.js-3.2.4/src/modules/core/event.js000066400000000000000000000071201463723416200176100ustar00rootroot00000000000000import { delimiter } from './regex.js' import { makeInstance } from '../../utils/adopter.js' import { globals } from '../../utils/window.js' let listenerId = 0 export const windowEvents = {} export function getEvents(instance) { let n = instance.getEventHolder() // We dont want to save events in global space if (n === globals.window) n = windowEvents if (!n.events) n.events = {} return n.events } export function getEventTarget(instance) { return instance.getEventTarget() } export function clearEvents(instance) { let n = instance.getEventHolder() if (n === globals.window) n = windowEvents if (n.events) n.events = {} } // Add event binder in the SVG namespace export function on(node, events, listener, binding, options) { const l = listener.bind(binding || node) const instance = makeInstance(node) const bag = getEvents(instance) const n = getEventTarget(instance) // events can be an array of events or a string of events events = Array.isArray(events) ? events : events.split(delimiter) // add id to listener if (!listener._svgjsListenerId) { listener._svgjsListenerId = ++listenerId } events.forEach(function (event) { const ev = event.split('.')[0] const ns = event.split('.')[1] || '*' // ensure valid object bag[ev] = bag[ev] || {} bag[ev][ns] = bag[ev][ns] || {} // reference listener bag[ev][ns][listener._svgjsListenerId] = l // add listener n.addEventListener(ev, l, options || false) }) } // Add event unbinder in the SVG namespace export function off(node, events, listener, options) { const instance = makeInstance(node) const bag = getEvents(instance) const n = getEventTarget(instance) // listener can be a function or a number if (typeof listener === 'function') { listener = listener._svgjsListenerId if (!listener) return } // events can be an array of events or a string or undefined events = Array.isArray(events) ? events : (events || '').split(delimiter) events.forEach(function (event) { const ev = event && event.split('.')[0] const ns = event && event.split('.')[1] let namespace, l if (listener) { // remove listener reference if (bag[ev] && bag[ev][ns || '*']) { // removeListener n.removeEventListener( ev, bag[ev][ns || '*'][listener], options || false ) delete bag[ev][ns || '*'][listener] } } else if (ev && ns) { // remove all listeners for a namespaced event if (bag[ev] && bag[ev][ns]) { for (l in bag[ev][ns]) { off(n, [ev, ns].join('.'), l) } delete bag[ev][ns] } } else if (ns) { // remove all listeners for a specific namespace for (event in bag) { for (namespace in bag[event]) { if (ns === namespace) { off(n, [event, ns].join('.')) } } } } else if (ev) { // remove all listeners for the event if (bag[ev]) { for (namespace in bag[ev]) { off(n, [ev, namespace].join('.')) } delete bag[ev] } } else { // remove all listeners on a given node for (event in bag) { off(n, event) } clearEvents(instance) } }) } export function dispatch(node, event, data, options) { const n = getEventTarget(node) // Dispatch event if (event instanceof globals.window.Event) { n.dispatchEvent(event) } else { event = new globals.window.CustomEvent(event, { detail: data, cancelable: true, ...options }) n.dispatchEvent(event) } return event } svg.js-3.2.4/src/modules/core/gradiented.js000066400000000000000000000007451463723416200206030ustar00rootroot00000000000000import SVGNumber from '../../types/SVGNumber.js' export function from(x, y) { return (this._element || this).type === 'radialGradient' ? this.attr({ fx: new SVGNumber(x), fy: new SVGNumber(y) }) : this.attr({ x1: new SVGNumber(x), y1: new SVGNumber(y) }) } export function to(x, y) { return (this._element || this).type === 'radialGradient' ? this.attr({ cx: new SVGNumber(x), cy: new SVGNumber(y) }) : this.attr({ x2: new SVGNumber(x), y2: new SVGNumber(y) }) } svg.js-3.2.4/src/modules/core/namespaces.js000066400000000000000000000003421463723416200206050ustar00rootroot00000000000000// Default namespaces export const svg = 'http://www.w3.org/2000/svg' export const html = 'http://www.w3.org/1999/xhtml' export const xmlns = 'http://www.w3.org/2000/xmlns/' export const xlink = 'http://www.w3.org/1999/xlink' svg.js-3.2.4/src/modules/core/parser.js000066400000000000000000000013211463723416200177600ustar00rootroot00000000000000import { globals } from '../../utils/window.js' import { makeInstance } from '../../utils/adopter.js' export default function parser() { // Reuse cached element if possible if (!parser.nodes) { const svg = makeInstance().size(2, 0) svg.node.style.cssText = [ 'opacity: 0', 'position: absolute', 'left: -100%', 'top: -100%', 'overflow: hidden' ].join(';') svg.attr('focusable', 'false') svg.attr('aria-hidden', 'true') const path = svg.path().node parser.nodes = { svg, path } } if (!parser.nodes.svg.node.parentNode) { const b = globals.document.body || globals.document.documentElement parser.nodes.svg.addTo(b) } return parser.nodes } svg.js-3.2.4/src/modules/core/pointed.js000066400000000000000000000012021463723416200201240ustar00rootroot00000000000000import PointArray from '../../types/PointArray.js' export const MorphArray = PointArray // Move by left top corner over x-axis export function x(x) { return x == null ? this.bbox().x : this.move(x, this.bbox().y) } // Move by left top corner over y-axis export function y(y) { return y == null ? this.bbox().y : this.move(this.bbox().x, y) } // Set width of element export function width(width) { const b = this.bbox() return width == null ? b.width : this.size(width, b.height) } // Set height of element export function height(height) { const b = this.bbox() return height == null ? b.height : this.size(b.width, height) } svg.js-3.2.4/src/modules/core/poly.js000066400000000000000000000015001463723416200174460ustar00rootroot00000000000000import { proportionalSize } from '../../utils/utils.js' import PointArray from '../../types/PointArray.js' // Get array export function array() { return this._array || (this._array = new PointArray(this.attr('points'))) } // Clear array cache export function clear() { delete this._array return this } // Move by left top corner export function move(x, y) { return this.attr('points', this.array().move(x, y)) } // Plot new path export function plot(p) { return p == null ? this.array() : this.clear().attr( 'points', typeof p === 'string' ? p : (this._array = new PointArray(p)) ) } // Set element size to given width and height export function size(width, height) { const p = proportionalSize(this, width, height) return this.attr('points', this.array().size(p.width, p.height)) } svg.js-3.2.4/src/modules/core/regex.js000066400000000000000000000016611463723416200176050ustar00rootroot00000000000000// Parse unit value export const numberAndUnit = /^([+-]?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?)([a-z%]*)$/i // Parse hex value export const hex = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i // Parse rgb value export const rgb = /rgb\((\d+),(\d+),(\d+)\)/ // Parse reference id export const reference = /(#[a-z_][a-z0-9\-_]*)/i // splits a transformation chain export const transforms = /\)\s*,?\s*/ // Whitespace export const whitespace = /\s/g // Test hex value export const isHex = /^#[a-f0-9]{3}$|^#[a-f0-9]{6}$/i // Test rgb value export const isRgb = /^rgb\(/ // Test for blank string export const isBlank = /^(\s+)?$/ // Test for numeric string export const isNumber = /^[+-]?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i // Test for image url export const isImage = /\.(jpg|jpeg|png|gif|svg)(\?[^=]+.*)?/i // split at whitespace and comma export const delimiter = /[\s,]+/ // Test for path letter export const isPathLetter = /[MLHVCSQTAZ]/i svg.js-3.2.4/src/modules/core/selector.js000066400000000000000000000010331463723416200203040ustar00rootroot00000000000000import { adopt } from '../../utils/adopter.js' import { globals } from '../../utils/window.js' import { map } from '../../utils/utils.js' import List from '../../types/List.js' export default function baseFind(query, parent) { return new List( map((parent || globals.document).querySelectorAll(query), function (node) { return adopt(node) }) ) } // Scoped find method export function find(query) { return baseFind(query, this.node) } export function findOne(query) { return adopt(this.node.querySelector(query)) } svg.js-3.2.4/src/modules/core/textable.js000066400000000000000000000030341463723416200202770ustar00rootroot00000000000000import { globals } from '../../utils/window.js' // Create plain text node export function plain(text) { // clear if build mode is disabled if (this._build === false) { this.clear() } // create text node this.node.appendChild(globals.document.createTextNode(text)) return this } // Get length of text element export function length() { return this.node.getComputedTextLength() } // Move over x-axis // Text is moved by its bounding box // text-anchor does NOT matter export function x(x, box = this.bbox()) { if (x == null) { return box.x } return this.attr('x', this.attr('x') + x - box.x) } // Move over y-axis export function y(y, box = this.bbox()) { if (y == null) { return box.y } return this.attr('y', this.attr('y') + y - box.y) } export function move(x, y, box = this.bbox()) { return this.x(x, box).y(y, box) } // Move center over x-axis export function cx(x, box = this.bbox()) { if (x == null) { return box.cx } return this.attr('x', this.attr('x') + x - box.cx) } // Move center over y-axis export function cy(y, box = this.bbox()) { if (y == null) { return box.cy } return this.attr('y', this.attr('y') + y - box.cy) } export function center(x, y, box = this.bbox()) { return this.cx(x, box).cy(y, box) } export function ax(x) { return this.attr('x', x) } export function ay(y) { return this.attr('y', y) } export function amove(x, y) { return this.ax(x).ay(y) } // Enable / disable build mode export function build(build) { this._build = !!build return this } svg.js-3.2.4/src/modules/optional/000077500000000000000000000000001463723416200170265ustar00rootroot00000000000000svg.js-3.2.4/src/modules/optional/arrange.js000066400000000000000000000041151463723416200210040ustar00rootroot00000000000000import { makeInstance } from '../../utils/adopter.js' import { registerMethods } from '../../utils/methods.js' // Get all siblings, including myself export function siblings() { return this.parent().children() } // Get the current position siblings export function position() { return this.parent().index(this) } // Get the next element (will return null if there is none) export function next() { return this.siblings()[this.position() + 1] } // Get the next element (will return null if there is none) export function prev() { return this.siblings()[this.position() - 1] } // Send given element one step forward export function forward() { const i = this.position() const p = this.parent() // move node one step forward p.add(this.remove(), i + 1) return this } // Send given element one step backward export function backward() { const i = this.position() const p = this.parent() p.add(this.remove(), i ? i - 1 : 0) return this } // Send given element all the way to the front export function front() { const p = this.parent() // Move node forward p.add(this.remove()) return this } // Send given element all the way to the back export function back() { const p = this.parent() // Move node back p.add(this.remove(), 0) return this } // Inserts a given element before the targeted element export function before(element) { element = makeInstance(element) element.remove() const i = this.position() this.parent().add(element, i) return this } // Inserts a given element after the targeted element export function after(element) { element = makeInstance(element) element.remove() const i = this.position() this.parent().add(element, i + 1) return this } export function insertBefore(element) { element = makeInstance(element) element.before(this) return this } export function insertAfter(element) { element = makeInstance(element) element.after(this) return this } registerMethods('Dom', { siblings, position, next, prev, forward, backward, front, back, before, after, insertBefore, insertAfter }) svg.js-3.2.4/src/modules/optional/class.js000066400000000000000000000021461463723416200204740ustar00rootroot00000000000000import { delimiter } from '../core/regex.js' import { registerMethods } from '../../utils/methods.js' // Return array of classes on the node export function classes() { const attr = this.attr('class') return attr == null ? [] : attr.trim().split(delimiter) } // Return true if class exists on the node, false otherwise export function hasClass(name) { return this.classes().indexOf(name) !== -1 } // Add class to the node export function addClass(name) { if (!this.hasClass(name)) { const array = this.classes() array.push(name) this.attr('class', array.join(' ')) } return this } // Remove class from the node export function removeClass(name) { if (this.hasClass(name)) { this.attr( 'class', this.classes() .filter(function (c) { return c !== name }) .join(' ') ) } return this } // Toggle the presence of a class on the node export function toggleClass(name) { return this.hasClass(name) ? this.removeClass(name) : this.addClass(name) } registerMethods('Dom', { classes, hasClass, addClass, removeClass, toggleClass }) svg.js-3.2.4/src/modules/optional/css.js000066400000000000000000000032161463723416200201560ustar00rootroot00000000000000import { isBlank } from '../core/regex.js' import { registerMethods } from '../../utils/methods.js' // Dynamic style generator export function css(style, val) { const ret = {} if (arguments.length === 0) { // get full style as object this.node.style.cssText .split(/\s*;\s*/) .filter(function (el) { return !!el.length }) .forEach(function (el) { const t = el.split(/\s*:\s*/) ret[t[0]] = t[1] }) return ret } if (arguments.length < 2) { // get style properties as array if (Array.isArray(style)) { for (const name of style) { const cased = name ret[name] = this.node.style.getPropertyValue(cased) } return ret } // get style for property if (typeof style === 'string') { return this.node.style.getPropertyValue(style) } // set styles in object if (typeof style === 'object') { for (const name in style) { // set empty string if null/undefined/'' was given this.node.style.setProperty( name, style[name] == null || isBlank.test(style[name]) ? '' : style[name] ) } } } // set style for property if (arguments.length === 2) { this.node.style.setProperty( style, val == null || isBlank.test(val) ? '' : val ) } return this } // Show element export function show() { return this.css('display', '') } // Hide element export function hide() { return this.css('display', 'none') } // Is element visible? export function visible() { return this.css('display') !== 'none' } registerMethods('Dom', { css, show, hide, visible }) svg.js-3.2.4/src/modules/optional/data.js000066400000000000000000000020421463723416200202730ustar00rootroot00000000000000import { registerMethods } from '../../utils/methods.js' import { filter, map } from '../../utils/utils.js' // Store data values on svg nodes export function data(a, v, r) { if (a == null) { // get an object of attributes return this.data( map( filter( this.node.attributes, (el) => el.nodeName.indexOf('data-') === 0 ), (el) => el.nodeName.slice(5) ) ) } else if (a instanceof Array) { const data = {} for (const key of a) { data[key] = this.data(key) } return data } else if (typeof a === 'object') { for (v in a) { this.data(v, a[v]) } } else if (arguments.length < 2) { try { return JSON.parse(this.attr('data-' + a)) } catch (e) { return this.attr('data-' + a) } } else { this.attr( 'data-' + a, v === null ? null : r === true || typeof v === 'string' || typeof v === 'number' ? v : JSON.stringify(v) ) } return this } registerMethods('Dom', { data }) svg.js-3.2.4/src/modules/optional/memory.js000066400000000000000000000017371463723416200207040ustar00rootroot00000000000000import { registerMethods } from '../../utils/methods.js' // Remember arbitrary data export function remember(k, v) { // remember every item in an object individually if (typeof arguments[0] === 'object') { for (const key in k) { this.remember(key, k[key]) } } else if (arguments.length === 1) { // retrieve memory return this.memory()[k] } else { // store memory this.memory()[k] = v } return this } // Erase a given memory export function forget() { if (arguments.length === 0) { this._memory = {} } else { for (let i = arguments.length - 1; i >= 0; i--) { delete this.memory()[arguments[i]] } } return this } // This triggers creation of a new hidden class which is not performant // However, this function is not rarely used so it will not happen frequently // Return local memory object export function memory() { return (this._memory = this._memory || {}) } registerMethods('Dom', { remember, forget, memory }) svg.js-3.2.4/src/modules/optional/sugar.js000066400000000000000000000110711463723416200205050ustar00rootroot00000000000000import { registerMethods } from '../../utils/methods.js' import Color from '../../types/Color.js' import Element from '../../elements/Element.js' import Matrix from '../../types/Matrix.js' import Point from '../../types/Point.js' import SVGNumber from '../../types/SVGNumber.js' // Define list of available attributes for stroke and fill const sugar = { stroke: [ 'color', 'width', 'opacity', 'linecap', 'linejoin', 'miterlimit', 'dasharray', 'dashoffset' ], fill: ['color', 'opacity', 'rule'], prefix: function (t, a) { return a === 'color' ? t : t + '-' + a } } // Add sugar for fill and stroke ;['fill', 'stroke'].forEach(function (m) { const extension = {} let i extension[m] = function (o) { if (typeof o === 'undefined') { return this.attr(m) } if ( typeof o === 'string' || o instanceof Color || Color.isRgb(o) || o instanceof Element ) { this.attr(m, o) } else { // set all attributes from sugar.fill and sugar.stroke list for (i = sugar[m].length - 1; i >= 0; i--) { if (o[sugar[m][i]] != null) { this.attr(sugar.prefix(m, sugar[m][i]), o[sugar[m][i]]) } } } return this } registerMethods(['Element', 'Runner'], extension) }) registerMethods(['Element', 'Runner'], { // Let the user set the matrix directly matrix: function (mat, b, c, d, e, f) { // Act as a getter if (mat == null) { return new Matrix(this) } // Act as a setter, the user can pass a matrix or a set of numbers return this.attr('transform', new Matrix(mat, b, c, d, e, f)) }, // Map rotation to transform rotate: function (angle, cx, cy) { return this.transform({ rotate: angle, ox: cx, oy: cy }, true) }, // Map skew to transform skew: function (x, y, cx, cy) { return arguments.length === 1 || arguments.length === 3 ? this.transform({ skew: x, ox: y, oy: cx }, true) : this.transform({ skew: [x, y], ox: cx, oy: cy }, true) }, shear: function (lam, cx, cy) { return this.transform({ shear: lam, ox: cx, oy: cy }, true) }, // Map scale to transform scale: function (x, y, cx, cy) { return arguments.length === 1 || arguments.length === 3 ? this.transform({ scale: x, ox: y, oy: cx }, true) : this.transform({ scale: [x, y], ox: cx, oy: cy }, true) }, // Map translate to transform translate: function (x, y) { return this.transform({ translate: [x, y] }, true) }, // Map relative translations to transform relative: function (x, y) { return this.transform({ relative: [x, y] }, true) }, // Map flip to transform flip: function (direction = 'both', origin = 'center') { if ('xybothtrue'.indexOf(direction) === -1) { origin = direction direction = 'both' } return this.transform({ flip: direction, origin: origin }, true) }, // Opacity opacity: function (value) { return this.attr('opacity', value) } }) registerMethods('radius', { // Add x and y radius radius: function (x, y = x) { const type = (this._element || this).type return type === 'radialGradient' ? this.attr('r', new SVGNumber(x)) : this.rx(x).ry(y) } }) registerMethods('Path', { // Get path length length: function () { return this.node.getTotalLength() }, // Get point at length pointAt: function (length) { return new Point(this.node.getPointAtLength(length)) } }) registerMethods(['Element', 'Runner'], { // Set font font: function (a, v) { if (typeof a === 'object') { for (v in a) this.font(v, a[v]) return this } return a === 'leading' ? this.leading(v) : a === 'anchor' ? this.attr('text-anchor', v) : a === 'size' || a === 'family' || a === 'weight' || a === 'stretch' || a === 'variant' || a === 'style' ? this.attr('font-' + a, v) : this.attr(a, v) } }) // Add events to elements const methods = [ 'click', 'dblclick', 'mousedown', 'mouseup', 'mouseover', 'mouseout', 'mousemove', 'mouseenter', 'mouseleave', 'touchstart', 'touchmove', 'touchleave', 'touchend', 'touchcancel', 'contextmenu', 'wheel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel' ].reduce(function (last, event) { // add event to Element const fn = function (f) { if (f === null) { this.off(event) } else { this.on(event, f) } return this } last[event] = fn return last }, {}) registerMethods('Element', methods) svg.js-3.2.4/src/modules/optional/transform.js000066400000000000000000000044511463723416200214030ustar00rootroot00000000000000import { getOrigin, isDescriptive } from '../../utils/utils.js' import { delimiter, transforms } from '../core/regex.js' import { registerMethods } from '../../utils/methods.js' import Matrix from '../../types/Matrix.js' // Reset all transformations export function untransform() { return this.attr('transform', null) } // merge the whole transformation chain into one matrix and returns it export function matrixify() { const matrix = (this.attr('transform') || '') // split transformations .split(transforms) .slice(0, -1) .map(function (str) { // generate key => value pairs const kv = str.trim().split('(') return [ kv[0], kv[1].split(delimiter).map(function (str) { return parseFloat(str) }) ] }) .reverse() // merge every transformation into one matrix .reduce(function (matrix, transform) { if (transform[0] === 'matrix') { return matrix.lmultiply(Matrix.fromArray(transform[1])) } return matrix[transform[0]].apply(matrix, transform[1]) }, new Matrix()) return matrix } // add an element to another parent without changing the visual representation on the screen export function toParent(parent, i) { if (this === parent) return this if (isDescriptive(this.node)) return this.addTo(parent, i) const ctm = this.screenCTM() const pCtm = parent.screenCTM().inverse() this.addTo(parent, i).untransform().transform(pCtm.multiply(ctm)) return this } // same as above with parent equals root-svg export function toRoot(i) { return this.toParent(this.root(), i) } // Add transformations export function transform(o, relative) { // Act as a getter if no object was passed if (o == null || typeof o === 'string') { const decomposed = new Matrix(this).decompose() return o == null ? decomposed : decomposed[o] } if (!Matrix.isMatrixLike(o)) { // Set the origin according to the defined transform o = { ...o, origin: getOrigin(o, this) } } // The user can pass a boolean, an Element or an Matrix or nothing const cleanRelative = relative === true ? this : relative || false const result = new Matrix(cleanRelative).transform(o) return this.attr('transform', result) } registerMethods('Element', { untransform, matrixify, toParent, toRoot, transform }) svg.js-3.2.4/src/polyfills/000077500000000000000000000000001463723416200155465ustar00rootroot00000000000000svg.js-3.2.4/src/polyfills/children.js000066400000000000000000000003361463723416200176760ustar00rootroot00000000000000import { filter } from '../utils/utils.js' // IE11: children does not work for svg nodes export default function children(node) { return filter(node.childNodes, function (child) { return child.nodeType === 1 }) } svg.js-3.2.4/src/polyfills/innerHTML.js000066400000000000000000000061031463723416200177040ustar00rootroot00000000000000;(function () { try { if (SVGElement.prototype.innerHTML) return } catch (e) { return } const serializeXML = function (node, output) { const nodeType = node.nodeType if (nodeType === 3) { output.push( node.textContent .replace(/&/, '&') .replace(/', '>') ) } else if (nodeType === 1) { output.push('<', node.tagName) if (node.hasAttributes()) { ;[].forEach.call(node.attributes, function (attrNode) { output.push(' ', attrNode.name, '="', attrNode.value, '"') }) } output.push('>') if (node.hasChildNodes()) { ;[].forEach.call(node.childNodes, function (childNode) { serializeXML(childNode, output) }) } else { // output.push('/>') } output.push('') } else if (nodeType === 8) { output.push('') } } Object.defineProperty(SVGElement.prototype, 'innerHTML', { get: function () { const output = [] let childNode = this.firstChild while (childNode) { serializeXML(childNode, output) childNode = childNode.nextSibling } return output.join('') }, set: function (markupText) { while (this.firstChild) { this.removeChild(this.firstChild) } try { const dXML = new DOMParser() dXML.async = false const sXML = "" + markupText + '' const svgDocElement = dXML.parseFromString( sXML, 'text/xml' ).documentElement let childNode = svgDocElement.firstChild while (childNode) { this.appendChild(this.ownerDocument.importNode(childNode, true)) childNode = childNode.nextSibling } } catch (e) { throw new Error('Can not set innerHTML on node') } } }) Object.defineProperty(SVGElement.prototype, 'outerHTML', { get: function () { const output = [] serializeXML(this, output) return output.join('') }, set: function (markupText) { while (this.firstChild) { this.removeChild(this.firstChild) } try { const dXML = new DOMParser() dXML.async = false const sXML = "" + markupText + '' const svgDocElement = dXML.parseFromString( sXML, 'text/xml' ).documentElement let childNode = svgDocElement.firstChild while (childNode) { this.parentNode.insertBefore( this.ownerDocument.importNode(childNode, true), this ) // this.appendChild(this.ownerDocument.importNode(childNode, true)); childNode = childNode.nextSibling } } catch (e) { throw new Error('Can not set outerHTML on node') } } }) })() svg.js-3.2.4/src/svg.js000066400000000000000000000003601463723416200146650ustar00rootroot00000000000000import * as svgMembers from './main.js' import { makeInstance } from './utils/adopter.js' // The main wrapping element export default function SVG(element, isHTML) { return makeInstance(element, isHTML) } Object.assign(SVG, svgMembers) svg.js-3.2.4/src/types/000077500000000000000000000000001463723416200146755ustar00rootroot00000000000000svg.js-3.2.4/src/types/Base.js000066400000000000000000000004141463723416200161040ustar00rootroot00000000000000export default class Base { // constructor (node/*, {extensions = []} */) { // // this.tags = [] // // // // for (let extension of extensions) { // // extension.setup.call(this, node) // // this.tags.push(extension.name) // // } // } } svg.js-3.2.4/src/types/Box.js000066400000000000000000000166011463723416200157670ustar00rootroot00000000000000import { delimiter } from '../modules/core/regex.js' import { globals } from '../utils/window.js' import { register } from '../utils/adopter.js' import { registerMethods } from '../utils/methods.js' import Matrix from './Matrix.js' import Point from './Point.js' import parser from '../modules/core/parser.js' export function isNulledBox(box) { return !box.width && !box.height && !box.x && !box.y } export function domContains(node) { return ( node === globals.document || ( globals.document.documentElement.contains || function (node) { // This is IE - it does not support contains() for top-level SVGs while (node.parentNode) { node = node.parentNode } return node === globals.document } ).call(globals.document.documentElement, node) ) } export default class Box { constructor(...args) { this.init(...args) } addOffset() { // offset by window scroll position, because getBoundingClientRect changes when window is scrolled this.x += globals.window.pageXOffset this.y += globals.window.pageYOffset return new Box(this) } init(source) { const base = [0, 0, 0, 0] source = typeof source === 'string' ? source.split(delimiter).map(parseFloat) : Array.isArray(source) ? source : typeof source === 'object' ? [ source.left != null ? source.left : source.x, source.top != null ? source.top : source.y, source.width, source.height ] : arguments.length === 4 ? [].slice.call(arguments) : base this.x = source[0] || 0 this.y = source[1] || 0 this.width = this.w = source[2] || 0 this.height = this.h = source[3] || 0 // Add more bounding box properties this.x2 = this.x + this.w this.y2 = this.y + this.h this.cx = this.x + this.w / 2 this.cy = this.y + this.h / 2 return this } isNulled() { return isNulledBox(this) } // Merge rect box with another, return a new instance merge(box) { const x = Math.min(this.x, box.x) const y = Math.min(this.y, box.y) const width = Math.max(this.x + this.width, box.x + box.width) - x const height = Math.max(this.y + this.height, box.y + box.height) - y return new Box(x, y, width, height) } toArray() { return [this.x, this.y, this.width, this.height] } toString() { return this.x + ' ' + this.y + ' ' + this.width + ' ' + this.height } transform(m) { if (!(m instanceof Matrix)) { m = new Matrix(m) } let xMin = Infinity let xMax = -Infinity let yMin = Infinity let yMax = -Infinity const pts = [ new Point(this.x, this.y), new Point(this.x2, this.y), new Point(this.x, this.y2), new Point(this.x2, this.y2) ] pts.forEach(function (p) { p = p.transform(m) xMin = Math.min(xMin, p.x) xMax = Math.max(xMax, p.x) yMin = Math.min(yMin, p.y) yMax = Math.max(yMax, p.y) }) return new Box(xMin, yMin, xMax - xMin, yMax - yMin) } } function getBox(el, getBBoxFn, retry) { let box try { // Try to get the box with the provided function box = getBBoxFn(el.node) // If the box is worthless and not even in the dom, retry // by throwing an error here... if (isNulledBox(box) && !domContains(el.node)) { throw new Error('Element not in the dom') } } catch (e) { // ... and calling the retry handler here box = retry(el) } return box } export function bbox() { // Function to get bbox is getBBox() const getBBox = (node) => node.getBBox() // Take all measures so that a stupid browser renders the element // so we can get the bbox from it when we try again const retry = (el) => { try { const clone = el.clone().addTo(parser().svg).show() const box = clone.node.getBBox() clone.remove() return box } catch (e) { // We give up... throw new Error( `Getting bbox of element "${ el.node.nodeName }" is not possible: ${e.toString()}` ) } } const box = getBox(this, getBBox, retry) const bbox = new Box(box) return bbox } export function rbox(el) { const getRBox = (node) => node.getBoundingClientRect() const retry = (el) => { // There is no point in trying tricks here because if we insert the element into the dom ourselves // it obviously will be at the wrong position throw new Error( `Getting rbox of element "${el.node.nodeName}" is not possible` ) } const box = getBox(this, getRBox, retry) const rbox = new Box(box) // If an element was passed, we want the bbox in the coordinate system of that element if (el) { return rbox.transform(el.screenCTM().inverseO()) } // Else we want it in absolute screen coordinates // Therefore we need to add the scrollOffset return rbox.addOffset() } // Checks whether the given point is inside the bounding box export function inside(x, y) { const box = this.bbox() return ( x > box.x && y > box.y && x < box.x + box.width && y < box.y + box.height ) } registerMethods({ viewbox: { viewbox(x, y, width, height) { // act as getter if (x == null) return new Box(this.attr('viewBox')) // act as setter return this.attr('viewBox', new Box(x, y, width, height)) }, zoom(level, point) { // Its best to rely on the attributes here and here is why: // clientXYZ: Doesn't work on non-root svgs because they dont have a CSSBox (silly!) // getBoundingClientRect: Doesn't work because Chrome just ignores width and height of nested svgs completely // that means, their clientRect is always as big as the content. // Furthermore this size is incorrect if the element is further transformed by its parents // computedStyle: Only returns meaningful values if css was used with px. We dont go this route here! // getBBox: returns the bounding box of its content - that doesn't help! let { width, height } = this.attr(['width', 'height']) // Width and height is a string when a number with a unit is present which we can't use // So we try clientXYZ if ( (!width && !height) || typeof width === 'string' || typeof height === 'string' ) { width = this.node.clientWidth height = this.node.clientHeight } // Giving up... if (!width || !height) { throw new Error( 'Impossible to get absolute width and height. Please provide an absolute width and height attribute on the zooming element' ) } const v = this.viewbox() const zoomX = width / v.width const zoomY = height / v.height const zoom = Math.min(zoomX, zoomY) if (level == null) { return zoom } let zoomAmount = zoom / level // Set the zoomAmount to the highest value which is safe to process and recover from // The * 100 is a bit of wiggle room for the matrix transformation if (zoomAmount === Infinity) zoomAmount = Number.MAX_SAFE_INTEGER / 100 point = point || new Point(width / 2 / zoomX + v.x, height / 2 / zoomY + v.y) const box = new Box(v).transform( new Matrix({ scale: zoomAmount, origin: point }) ) return this.viewbox(box) } } }) register(Box, 'Box') svg.js-3.2.4/src/types/Color.js000066400000000000000000000315071463723416200163170ustar00rootroot00000000000000import { hex, isHex, isRgb, rgb, whitespace } from '../modules/core/regex.js' function sixDigitHex(hex) { return hex.length === 4 ? [ '#', hex.substring(1, 2), hex.substring(1, 2), hex.substring(2, 3), hex.substring(2, 3), hex.substring(3, 4), hex.substring(3, 4) ].join('') : hex } function componentHex(component) { const integer = Math.round(component) const bounded = Math.max(0, Math.min(255, integer)) const hex = bounded.toString(16) return hex.length === 1 ? '0' + hex : hex } function is(object, space) { for (let i = space.length; i--; ) { if (object[space[i]] == null) { return false } } return true } function getParameters(a, b) { const params = is(a, 'rgb') ? { _a: a.r, _b: a.g, _c: a.b, _d: 0, space: 'rgb' } : is(a, 'xyz') ? { _a: a.x, _b: a.y, _c: a.z, _d: 0, space: 'xyz' } : is(a, 'hsl') ? { _a: a.h, _b: a.s, _c: a.l, _d: 0, space: 'hsl' } : is(a, 'lab') ? { _a: a.l, _b: a.a, _c: a.b, _d: 0, space: 'lab' } : is(a, 'lch') ? { _a: a.l, _b: a.c, _c: a.h, _d: 0, space: 'lch' } : is(a, 'cmyk') ? { _a: a.c, _b: a.m, _c: a.y, _d: a.k, space: 'cmyk' } : { _a: 0, _b: 0, _c: 0, space: 'rgb' } params.space = b || params.space return params } function cieSpace(space) { if (space === 'lab' || space === 'xyz' || space === 'lch') { return true } else { return false } } function hueToRgb(p, q, t) { if (t < 0) t += 1 if (t > 1) t -= 1 if (t < 1 / 6) return p + (q - p) * 6 * t if (t < 1 / 2) return q if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6 return p } export default class Color { constructor(...inputs) { this.init(...inputs) } // Test if given value is a color static isColor(color) { return ( color && (color instanceof Color || this.isRgb(color) || this.test(color)) ) } // Test if given value is an rgb object static isRgb(color) { return ( color && typeof color.r === 'number' && typeof color.g === 'number' && typeof color.b === 'number' ) } /* Generating random colors */ static random(mode = 'vibrant', t) { // Get the math modules const { random, round, sin, PI: pi } = Math // Run the correct generator if (mode === 'vibrant') { const l = (81 - 57) * random() + 57 const c = (83 - 45) * random() + 45 const h = 360 * random() const color = new Color(l, c, h, 'lch') return color } else if (mode === 'sine') { t = t == null ? random() : t const r = round(80 * sin((2 * pi * t) / 0.5 + 0.01) + 150) const g = round(50 * sin((2 * pi * t) / 0.5 + 4.6) + 200) const b = round(100 * sin((2 * pi * t) / 0.5 + 2.3) + 150) const color = new Color(r, g, b) return color } else if (mode === 'pastel') { const l = (94 - 86) * random() + 86 const c = (26 - 9) * random() + 9 const h = 360 * random() const color = new Color(l, c, h, 'lch') return color } else if (mode === 'dark') { const l = 10 + 10 * random() const c = (125 - 75) * random() + 86 const h = 360 * random() const color = new Color(l, c, h, 'lch') return color } else if (mode === 'rgb') { const r = 255 * random() const g = 255 * random() const b = 255 * random() const color = new Color(r, g, b) return color } else if (mode === 'lab') { const l = 100 * random() const a = 256 * random() - 128 const b = 256 * random() - 128 const color = new Color(l, a, b, 'lab') return color } else if (mode === 'grey') { const grey = 255 * random() const color = new Color(grey, grey, grey) return color } else { throw new Error('Unsupported random color mode') } } // Test if given value is a color string static test(color) { return typeof color === 'string' && (isHex.test(color) || isRgb.test(color)) } cmyk() { // Get the rgb values for the current color const { _a, _b, _c } = this.rgb() const [r, g, b] = [_a, _b, _c].map((v) => v / 255) // Get the cmyk values in an unbounded format const k = Math.min(1 - r, 1 - g, 1 - b) if (k === 1) { // Catch the black case return new Color(0, 0, 0, 1, 'cmyk') } const c = (1 - r - k) / (1 - k) const m = (1 - g - k) / (1 - k) const y = (1 - b - k) / (1 - k) // Construct the new color const color = new Color(c, m, y, k, 'cmyk') return color } hsl() { // Get the rgb values const { _a, _b, _c } = this.rgb() const [r, g, b] = [_a, _b, _c].map((v) => v / 255) // Find the maximum and minimum values to get the lightness const max = Math.max(r, g, b) const min = Math.min(r, g, b) const l = (max + min) / 2 // If the r, g, v values are identical then we are grey const isGrey = max === min // Calculate the hue and saturation const delta = max - min const s = isGrey ? 0 : l > 0.5 ? delta / (2 - max - min) : delta / (max + min) const h = isGrey ? 0 : max === r ? ((g - b) / delta + (g < b ? 6 : 0)) / 6 : max === g ? ((b - r) / delta + 2) / 6 : max === b ? ((r - g) / delta + 4) / 6 : 0 // Construct and return the new color const color = new Color(360 * h, 100 * s, 100 * l, 'hsl') return color } init(a = 0, b = 0, c = 0, d = 0, space = 'rgb') { // This catches the case when a falsy value is passed like '' a = !a ? 0 : a // Reset all values in case the init function is rerun with new color space if (this.space) { for (const component in this.space) { delete this[this.space[component]] } } if (typeof a === 'number') { // Allow for the case that we don't need d... space = typeof d === 'string' ? d : space d = typeof d === 'string' ? 0 : d // Assign the values straight to the color Object.assign(this, { _a: a, _b: b, _c: c, _d: d, space }) // If the user gave us an array, make the color from it } else if (a instanceof Array) { this.space = b || (typeof a[3] === 'string' ? a[3] : a[4]) || 'rgb' Object.assign(this, { _a: a[0], _b: a[1], _c: a[2], _d: a[3] || 0 }) } else if (a instanceof Object) { // Set the object up and assign its values directly const values = getParameters(a, b) Object.assign(this, values) } else if (typeof a === 'string') { if (isRgb.test(a)) { const noWhitespace = a.replace(whitespace, '') const [_a, _b, _c] = rgb .exec(noWhitespace) .slice(1, 4) .map((v) => parseInt(v)) Object.assign(this, { _a, _b, _c, _d: 0, space: 'rgb' }) } else if (isHex.test(a)) { const hexParse = (v) => parseInt(v, 16) const [, _a, _b, _c] = hex.exec(sixDigitHex(a)).map(hexParse) Object.assign(this, { _a, _b, _c, _d: 0, space: 'rgb' }) } else throw Error("Unsupported string format, can't construct Color") } // Now add the components as a convenience const { _a, _b, _c, _d } = this const components = this.space === 'rgb' ? { r: _a, g: _b, b: _c } : this.space === 'xyz' ? { x: _a, y: _b, z: _c } : this.space === 'hsl' ? { h: _a, s: _b, l: _c } : this.space === 'lab' ? { l: _a, a: _b, b: _c } : this.space === 'lch' ? { l: _a, c: _b, h: _c } : this.space === 'cmyk' ? { c: _a, m: _b, y: _c, k: _d } : {} Object.assign(this, components) } lab() { // Get the xyz color const { x, y, z } = this.xyz() // Get the lab components const l = 116 * y - 16 const a = 500 * (x - y) const b = 200 * (y - z) // Construct and return a new color const color = new Color(l, a, b, 'lab') return color } lch() { // Get the lab color directly const { l, a, b } = this.lab() // Get the chromaticity and the hue using polar coordinates const c = Math.sqrt(a ** 2 + b ** 2) let h = (180 * Math.atan2(b, a)) / Math.PI if (h < 0) { h *= -1 h = 360 - h } // Make a new color and return it const color = new Color(l, c, h, 'lch') return color } /* Conversion Methods */ rgb() { if (this.space === 'rgb') { return this } else if (cieSpace(this.space)) { // Convert to the xyz color space let { x, y, z } = this if (this.space === 'lab' || this.space === 'lch') { // Get the values in the lab space let { l, a, b } = this if (this.space === 'lch') { const { c, h } = this const dToR = Math.PI / 180 a = c * Math.cos(dToR * h) b = c * Math.sin(dToR * h) } // Undo the nonlinear function const yL = (l + 16) / 116 const xL = a / 500 + yL const zL = yL - b / 200 // Get the xyz values const ct = 16 / 116 const mx = 0.008856 const nm = 7.787 x = 0.95047 * (xL ** 3 > mx ? xL ** 3 : (xL - ct) / nm) y = 1.0 * (yL ** 3 > mx ? yL ** 3 : (yL - ct) / nm) z = 1.08883 * (zL ** 3 > mx ? zL ** 3 : (zL - ct) / nm) } // Convert xyz to unbounded rgb values const rU = x * 3.2406 + y * -1.5372 + z * -0.4986 const gU = x * -0.9689 + y * 1.8758 + z * 0.0415 const bU = x * 0.0557 + y * -0.204 + z * 1.057 // Convert the values to true rgb values const pow = Math.pow const bd = 0.0031308 const r = rU > bd ? 1.055 * pow(rU, 1 / 2.4) - 0.055 : 12.92 * rU const g = gU > bd ? 1.055 * pow(gU, 1 / 2.4) - 0.055 : 12.92 * gU const b = bU > bd ? 1.055 * pow(bU, 1 / 2.4) - 0.055 : 12.92 * bU // Make and return the color const color = new Color(255 * r, 255 * g, 255 * b) return color } else if (this.space === 'hsl') { // https://bgrins.github.io/TinyColor/docs/tinycolor.html // Get the current hsl values let { h, s, l } = this h /= 360 s /= 100 l /= 100 // If we are grey, then just make the color directly if (s === 0) { l *= 255 const color = new Color(l, l, l) return color } // TODO I have no idea what this does :D If you figure it out, tell me! const q = l < 0.5 ? l * (1 + s) : l + s - l * s const p = 2 * l - q // Get the rgb values const r = 255 * hueToRgb(p, q, h + 1 / 3) const g = 255 * hueToRgb(p, q, h) const b = 255 * hueToRgb(p, q, h - 1 / 3) // Make a new color const color = new Color(r, g, b) return color } else if (this.space === 'cmyk') { // https://gist.github.com/felipesabino/5066336 // Get the normalised cmyk values const { c, m, y, k } = this // Get the rgb values const r = 255 * (1 - Math.min(1, c * (1 - k) + k)) const g = 255 * (1 - Math.min(1, m * (1 - k) + k)) const b = 255 * (1 - Math.min(1, y * (1 - k) + k)) // Form the color and return it const color = new Color(r, g, b) return color } else { return this } } toArray() { const { _a, _b, _c, _d, space } = this return [_a, _b, _c, _d, space] } toHex() { const [r, g, b] = this._clamped().map(componentHex) return `#${r}${g}${b}` } toRgb() { const [rV, gV, bV] = this._clamped() const string = `rgb(${rV},${gV},${bV})` return string } toString() { return this.toHex() } xyz() { // Normalise the red, green and blue values const { _a: r255, _b: g255, _c: b255 } = this.rgb() const [r, g, b] = [r255, g255, b255].map((v) => v / 255) // Convert to the lab rgb space const rL = r > 0.04045 ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92 const gL = g > 0.04045 ? Math.pow((g + 0.055) / 1.055, 2.4) : g / 12.92 const bL = b > 0.04045 ? Math.pow((b + 0.055) / 1.055, 2.4) : b / 12.92 // Convert to the xyz color space without bounding the values const xU = (rL * 0.4124 + gL * 0.3576 + bL * 0.1805) / 0.95047 const yU = (rL * 0.2126 + gL * 0.7152 + bL * 0.0722) / 1.0 const zU = (rL * 0.0193 + gL * 0.1192 + bL * 0.9505) / 1.08883 // Get the proper xyz values by applying the bounding const x = xU > 0.008856 ? Math.pow(xU, 1 / 3) : 7.787 * xU + 16 / 116 const y = yU > 0.008856 ? Math.pow(yU, 1 / 3) : 7.787 * yU + 16 / 116 const z = zU > 0.008856 ? Math.pow(zU, 1 / 3) : 7.787 * zU + 16 / 116 // Make and return the color const color = new Color(x, y, z, 'xyz') return color } /* Input and Output methods */ _clamped() { const { _a, _b, _c } = this.rgb() const { max, min, round } = Math const format = (v) => max(0, min(round(v), 255)) return [_a, _b, _c].map(format) } /* Constructing colors */ } svg.js-3.2.4/src/types/EventTarget.js000066400000000000000000000021351463723416200174640ustar00rootroot00000000000000import { dispatch, off, on } from '../modules/core/event.js' import { register } from '../utils/adopter.js' import Base from './Base.js' export default class EventTarget extends Base { addEventListener() {} dispatch(event, data, options) { return dispatch(this, event, data, options) } dispatchEvent(event) { const bag = this.getEventHolder().events if (!bag) return true const events = bag[event.type] for (const i in events) { for (const j in events[i]) { events[i][j](event) } } return !event.defaultPrevented } // Fire given event fire(event, data, options) { this.dispatch(event, data, options) return this } getEventHolder() { return this } getEventTarget() { return this } // Unbind event from listener off(event, listener, options) { off(this, event, listener, options) return this } // Bind given event to listener on(event, listener, binding, options) { on(this, event, listener, binding, options) return this } removeEventListener() {} } register(EventTarget, 'EventTarget') svg.js-3.2.4/src/types/List.js000066400000000000000000000027531463723416200161550ustar00rootroot00000000000000import { extend } from '../utils/adopter.js' // import { subClassArray } from './ArrayPolyfill.js' class List extends Array { constructor(arr = [], ...args) { super(arr, ...args) if (typeof arr === 'number') return this this.length = 0 this.push(...arr) } } /* = subClassArray('List', Array, function (arr = []) { // This catches the case, that native map tries to create an array with new Array(1) if (typeof arr === 'number') return this this.length = 0 this.push(...arr) }) */ export default List extend([List], { each(fnOrMethodName, ...args) { if (typeof fnOrMethodName === 'function') { return this.map((el, i, arr) => { return fnOrMethodName.call(el, el, i, arr) }) } else { return this.map((el) => { return el[fnOrMethodName](...args) }) } }, toArray() { return Array.prototype.concat.apply([], this) } }) const reserved = ['toArray', 'constructor', 'each'] List.extend = function (methods) { methods = methods.reduce((obj, name) => { // Don't overwrite own methods if (reserved.includes(name)) return obj // Don't add private methods if (name[0] === '_') return obj // Allow access to original Array methods through a prefix if (name in Array.prototype) { obj['$' + name] = Array.prototype[name] } // Relay every call to each() obj[name] = function (...attrs) { return this.each(name, ...attrs) } return obj }, {}) extend([List], methods) } svg.js-3.2.4/src/types/Matrix.js000066400000000000000000000314511463723416200165030ustar00rootroot00000000000000import { delimiter } from '../modules/core/regex.js' import { radians } from '../utils/utils.js' import { register } from '../utils/adopter.js' import Element from '../elements/Element.js' import Point from './Point.js' function closeEnough(a, b, threshold) { return Math.abs(b - a) < (threshold || 1e-6) } export default class Matrix { constructor(...args) { this.init(...args) } static formatTransforms(o) { // Get all of the parameters required to form the matrix const flipBoth = o.flip === 'both' || o.flip === true const flipX = o.flip && (flipBoth || o.flip === 'x') ? -1 : 1 const flipY = o.flip && (flipBoth || o.flip === 'y') ? -1 : 1 const skewX = o.skew && o.skew.length ? o.skew[0] : isFinite(o.skew) ? o.skew : isFinite(o.skewX) ? o.skewX : 0 const skewY = o.skew && o.skew.length ? o.skew[1] : isFinite(o.skew) ? o.skew : isFinite(o.skewY) ? o.skewY : 0 const scaleX = o.scale && o.scale.length ? o.scale[0] * flipX : isFinite(o.scale) ? o.scale * flipX : isFinite(o.scaleX) ? o.scaleX * flipX : flipX const scaleY = o.scale && o.scale.length ? o.scale[1] * flipY : isFinite(o.scale) ? o.scale * flipY : isFinite(o.scaleY) ? o.scaleY * flipY : flipY const shear = o.shear || 0 const theta = o.rotate || o.theta || 0 const origin = new Point( o.origin || o.around || o.ox || o.originX, o.oy || o.originY ) const ox = origin.x const oy = origin.y // We need Point to be invalid if nothing was passed because we cannot default to 0 here. That is why NaN const position = new Point( o.position || o.px || o.positionX || NaN, o.py || o.positionY || NaN ) const px = position.x const py = position.y const translate = new Point( o.translate || o.tx || o.translateX, o.ty || o.translateY ) const tx = translate.x const ty = translate.y const relative = new Point( o.relative || o.rx || o.relativeX, o.ry || o.relativeY ) const rx = relative.x const ry = relative.y // Populate all of the values return { scaleX, scaleY, skewX, skewY, shear, theta, rx, ry, tx, ty, ox, oy, px, py } } static fromArray(a) { return { a: a[0], b: a[1], c: a[2], d: a[3], e: a[4], f: a[5] } } static isMatrixLike(o) { return ( o.a != null || o.b != null || o.c != null || o.d != null || o.e != null || o.f != null ) } // left matrix, right matrix, target matrix which is overwritten static matrixMultiply(l, r, o) { // Work out the product directly const a = l.a * r.a + l.c * r.b const b = l.b * r.a + l.d * r.b const c = l.a * r.c + l.c * r.d const d = l.b * r.c + l.d * r.d const e = l.e + l.a * r.e + l.c * r.f const f = l.f + l.b * r.e + l.d * r.f // make sure to use local variables because l/r and o could be the same o.a = a o.b = b o.c = c o.d = d o.e = e o.f = f return o } around(cx, cy, matrix) { return this.clone().aroundO(cx, cy, matrix) } // Transform around a center point aroundO(cx, cy, matrix) { const dx = cx || 0 const dy = cy || 0 return this.translateO(-dx, -dy).lmultiplyO(matrix).translateO(dx, dy) } // Clones this matrix clone() { return new Matrix(this) } // Decomposes this matrix into its affine parameters decompose(cx = 0, cy = 0) { // Get the parameters from the matrix const a = this.a const b = this.b const c = this.c const d = this.d const e = this.e const f = this.f // Figure out if the winding direction is clockwise or counterclockwise const determinant = a * d - b * c const ccw = determinant > 0 ? 1 : -1 // Since we only shear in x, we can use the x basis to get the x scale // and the rotation of the resulting matrix const sx = ccw * Math.sqrt(a * a + b * b) const thetaRad = Math.atan2(ccw * b, ccw * a) const theta = (180 / Math.PI) * thetaRad const ct = Math.cos(thetaRad) const st = Math.sin(thetaRad) // We can then solve the y basis vector simultaneously to get the other // two affine parameters directly from these parameters const lam = (a * c + b * d) / determinant const sy = (c * sx) / (lam * a - b) || (d * sx) / (lam * b + a) // Use the translations const tx = e - cx + cx * ct * sx + cy * (lam * ct * sx - st * sy) const ty = f - cy + cx * st * sx + cy * (lam * st * sx + ct * sy) // Construct the decomposition and return it return { // Return the affine parameters scaleX: sx, scaleY: sy, shear: lam, rotate: theta, translateX: tx, translateY: ty, originX: cx, originY: cy, // Return the matrix parameters a: this.a, b: this.b, c: this.c, d: this.d, e: this.e, f: this.f } } // Check if two matrices are equal equals(other) { if (other === this) return true const comp = new Matrix(other) return ( closeEnough(this.a, comp.a) && closeEnough(this.b, comp.b) && closeEnough(this.c, comp.c) && closeEnough(this.d, comp.d) && closeEnough(this.e, comp.e) && closeEnough(this.f, comp.f) ) } // Flip matrix on x or y, at a given offset flip(axis, around) { return this.clone().flipO(axis, around) } flipO(axis, around) { return axis === 'x' ? this.scaleO(-1, 1, around, 0) : axis === 'y' ? this.scaleO(1, -1, 0, around) : this.scaleO(-1, -1, axis, around || axis) // Define an x, y flip point } // Initialize init(source) { const base = Matrix.fromArray([1, 0, 0, 1, 0, 0]) // ensure source as object source = source instanceof Element ? source.matrixify() : typeof source === 'string' ? Matrix.fromArray(source.split(delimiter).map(parseFloat)) : Array.isArray(source) ? Matrix.fromArray(source) : typeof source === 'object' && Matrix.isMatrixLike(source) ? source : typeof source === 'object' ? new Matrix().transform(source) : arguments.length === 6 ? Matrix.fromArray([].slice.call(arguments)) : base // Merge the source matrix with the base matrix this.a = source.a != null ? source.a : base.a this.b = source.b != null ? source.b : base.b this.c = source.c != null ? source.c : base.c this.d = source.d != null ? source.d : base.d this.e = source.e != null ? source.e : base.e this.f = source.f != null ? source.f : base.f return this } inverse() { return this.clone().inverseO() } // Inverses matrix inverseO() { // Get the current parameters out of the matrix const a = this.a const b = this.b const c = this.c const d = this.d const e = this.e const f = this.f // Invert the 2x2 matrix in the top left const det = a * d - b * c if (!det) throw new Error('Cannot invert ' + this) // Calculate the top 2x2 matrix const na = d / det const nb = -b / det const nc = -c / det const nd = a / det // Apply the inverted matrix to the top right const ne = -(na * e + nc * f) const nf = -(nb * e + nd * f) // Construct the inverted matrix this.a = na this.b = nb this.c = nc this.d = nd this.e = ne this.f = nf return this } lmultiply(matrix) { return this.clone().lmultiplyO(matrix) } lmultiplyO(matrix) { const r = this const l = matrix instanceof Matrix ? matrix : new Matrix(matrix) return Matrix.matrixMultiply(l, r, this) } // Left multiplies by the given matrix multiply(matrix) { return this.clone().multiplyO(matrix) } multiplyO(matrix) { // Get the matrices const l = this const r = matrix instanceof Matrix ? matrix : new Matrix(matrix) return Matrix.matrixMultiply(l, r, this) } // Rotate matrix rotate(r, cx, cy) { return this.clone().rotateO(r, cx, cy) } rotateO(r, cx = 0, cy = 0) { // Convert degrees to radians r = radians(r) const cos = Math.cos(r) const sin = Math.sin(r) const { a, b, c, d, e, f } = this this.a = a * cos - b * sin this.b = b * cos + a * sin this.c = c * cos - d * sin this.d = d * cos + c * sin this.e = e * cos - f * sin + cy * sin - cx * cos + cx this.f = f * cos + e * sin - cx * sin - cy * cos + cy return this } // Scale matrix scale() { return this.clone().scaleO(...arguments) } scaleO(x, y = x, cx = 0, cy = 0) { // Support uniform scaling if (arguments.length === 3) { cy = cx cx = y y = x } const { a, b, c, d, e, f } = this this.a = a * x this.b = b * y this.c = c * x this.d = d * y this.e = e * x - cx * x + cx this.f = f * y - cy * y + cy return this } // Shear matrix shear(a, cx, cy) { return this.clone().shearO(a, cx, cy) } // eslint-disable-next-line no-unused-vars shearO(lx, cx = 0, cy = 0) { const { a, b, c, d, e, f } = this this.a = a + b * lx this.c = c + d * lx this.e = e + f * lx - cy * lx return this } // Skew Matrix skew() { return this.clone().skewO(...arguments) } skewO(x, y = x, cx = 0, cy = 0) { // support uniformal skew if (arguments.length === 3) { cy = cx cx = y y = x } // Convert degrees to radians x = radians(x) y = radians(y) const lx = Math.tan(x) const ly = Math.tan(y) const { a, b, c, d, e, f } = this this.a = a + b * lx this.b = b + a * ly this.c = c + d * lx this.d = d + c * ly this.e = e + f * lx - cy * lx this.f = f + e * ly - cx * ly return this } // SkewX skewX(x, cx, cy) { return this.skew(x, 0, cx, cy) } // SkewY skewY(y, cx, cy) { return this.skew(0, y, cx, cy) } toArray() { return [this.a, this.b, this.c, this.d, this.e, this.f] } // Convert matrix to string toString() { return ( 'matrix(' + this.a + ',' + this.b + ',' + this.c + ',' + this.d + ',' + this.e + ',' + this.f + ')' ) } // Transform a matrix into another matrix by manipulating the space transform(o) { // Check if o is a matrix and then left multiply it directly if (Matrix.isMatrixLike(o)) { const matrix = new Matrix(o) return matrix.multiplyO(this) } // Get the proposed transformations and the current transformations const t = Matrix.formatTransforms(o) const current = this const { x: ox, y: oy } = new Point(t.ox, t.oy).transform(current) // Construct the resulting matrix const transformer = new Matrix() .translateO(t.rx, t.ry) .lmultiplyO(current) .translateO(-ox, -oy) .scaleO(t.scaleX, t.scaleY) .skewO(t.skewX, t.skewY) .shearO(t.shear) .rotateO(t.theta) .translateO(ox, oy) // If we want the origin at a particular place, we force it there if (isFinite(t.px) || isFinite(t.py)) { const origin = new Point(ox, oy).transform(transformer) // TODO: Replace t.px with isFinite(t.px) // Doesn't work because t.px is also 0 if it wasn't passed const dx = isFinite(t.px) ? t.px - origin.x : 0 const dy = isFinite(t.py) ? t.py - origin.y : 0 transformer.translateO(dx, dy) } // Translate now after positioning transformer.translateO(t.tx, t.ty) return transformer } // Translate matrix translate(x, y) { return this.clone().translateO(x, y) } translateO(x, y) { this.e += x || 0 this.f += y || 0 return this } valueOf() { return { a: this.a, b: this.b, c: this.c, d: this.d, e: this.e, f: this.f } } } export function ctm() { return new Matrix(this.node.getCTM()) } export function screenCTM() { try { /* https://bugzilla.mozilla.org/show_bug.cgi?id=1344537 This is needed because FF does not return the transformation matrix for the inner coordinate system when getScreenCTM() is called on nested svgs. However all other Browsers do that */ if (typeof this.isRoot === 'function' && !this.isRoot()) { const rect = this.rect(1, 1) const m = rect.node.getScreenCTM() rect.remove() return new Matrix(m) } return new Matrix(this.node.getScreenCTM()) } catch (e) { console.warn( `Cannot get CTM from SVG node ${this.node.nodeName}. Is the element rendered?` ) return new Matrix() } } register(Matrix, 'Matrix') svg.js-3.2.4/src/types/PathArray.js000066400000000000000000000075501463723416200171350ustar00rootroot00000000000000import SVGArray from './SVGArray.js' import parser from '../modules/core/parser.js' import Box from './Box.js' import { pathParser } from '../utils/pathParser.js' function arrayToString(a) { let s = '' for (let i = 0, il = a.length; i < il; i++) { s += a[i][0] if (a[i][1] != null) { s += a[i][1] if (a[i][2] != null) { s += ' ' s += a[i][2] if (a[i][3] != null) { s += ' ' s += a[i][3] s += ' ' s += a[i][4] if (a[i][5] != null) { s += ' ' s += a[i][5] s += ' ' s += a[i][6] if (a[i][7] != null) { s += ' ' s += a[i][7] } } } } } } return s + ' ' } export default class PathArray extends SVGArray { // Get bounding box of path bbox() { parser().path.setAttribute('d', this.toString()) return new Box(parser.nodes.path.getBBox()) } // Move path string move(x, y) { // get bounding box of current situation const box = this.bbox() // get relative offset x -= box.x y -= box.y if (!isNaN(x) && !isNaN(y)) { // move every point for (let l, i = this.length - 1; i >= 0; i--) { l = this[i][0] if (l === 'M' || l === 'L' || l === 'T') { this[i][1] += x this[i][2] += y } else if (l === 'H') { this[i][1] += x } else if (l === 'V') { this[i][1] += y } else if (l === 'C' || l === 'S' || l === 'Q') { this[i][1] += x this[i][2] += y this[i][3] += x this[i][4] += y if (l === 'C') { this[i][5] += x this[i][6] += y } } else if (l === 'A') { this[i][6] += x this[i][7] += y } } } return this } // Absolutize and parse path to array parse(d = 'M0 0') { if (Array.isArray(d)) { d = Array.prototype.concat.apply([], d).toString() } return pathParser(d) } // Resize path string size(width, height) { // get bounding box of current situation const box = this.bbox() let i, l // If the box width or height is 0 then we ignore // transformations on the respective axis box.width = box.width === 0 ? 1 : box.width box.height = box.height === 0 ? 1 : box.height // recalculate position of all points according to new size for (i = this.length - 1; i >= 0; i--) { l = this[i][0] if (l === 'M' || l === 'L' || l === 'T') { this[i][1] = ((this[i][1] - box.x) * width) / box.width + box.x this[i][2] = ((this[i][2] - box.y) * height) / box.height + box.y } else if (l === 'H') { this[i][1] = ((this[i][1] - box.x) * width) / box.width + box.x } else if (l === 'V') { this[i][1] = ((this[i][1] - box.y) * height) / box.height + box.y } else if (l === 'C' || l === 'S' || l === 'Q') { this[i][1] = ((this[i][1] - box.x) * width) / box.width + box.x this[i][2] = ((this[i][2] - box.y) * height) / box.height + box.y this[i][3] = ((this[i][3] - box.x) * width) / box.width + box.x this[i][4] = ((this[i][4] - box.y) * height) / box.height + box.y if (l === 'C') { this[i][5] = ((this[i][5] - box.x) * width) / box.width + box.x this[i][6] = ((this[i][6] - box.y) * height) / box.height + box.y } } else if (l === 'A') { // resize radii this[i][1] = (this[i][1] * width) / box.width this[i][2] = (this[i][2] * height) / box.height // move position values this[i][6] = ((this[i][6] - box.x) * width) / box.width + box.x this[i][7] = ((this[i][7] - box.y) * height) / box.height + box.y } } return this } // Convert array to string toString() { return arrayToString(this) } } svg.js-3.2.4/src/types/Point.js000066400000000000000000000020331463723416200163220ustar00rootroot00000000000000import Matrix from './Matrix.js' export default class Point { // Initialize constructor(...args) { this.init(...args) } // Clone point clone() { return new Point(this) } init(x, y) { const base = { x: 0, y: 0 } // ensure source as object const source = Array.isArray(x) ? { x: x[0], y: x[1] } : typeof x === 'object' ? { x: x.x, y: x.y } : { x: x, y: y } // merge source this.x = source.x == null ? base.x : source.x this.y = source.y == null ? base.y : source.y return this } toArray() { return [this.x, this.y] } transform(m) { return this.clone().transformO(m) } // Transform point with matrix transformO(m) { if (!Matrix.isMatrixLike(m)) { m = new Matrix(m) } const { x, y } = this // Perform the matrix multiplication this.x = m.a * x + m.c * y + m.e this.y = m.b * x + m.d * y + m.f return this } } export function point(x, y) { return new Point(x, y).transformO(this.screenCTM().inverseO()) } svg.js-3.2.4/src/types/PointArray.js000066400000000000000000000055541463723416200173340ustar00rootroot00000000000000import { delimiter } from '../modules/core/regex.js' import SVGArray from './SVGArray.js' import Box from './Box.js' import Matrix from './Matrix.js' export default class PointArray extends SVGArray { // Get bounding box of points bbox() { let maxX = -Infinity let maxY = -Infinity let minX = Infinity let minY = Infinity this.forEach(function (el) { maxX = Math.max(el[0], maxX) maxY = Math.max(el[1], maxY) minX = Math.min(el[0], minX) minY = Math.min(el[1], minY) }) return new Box(minX, minY, maxX - minX, maxY - minY) } // Move point string move(x, y) { const box = this.bbox() // get relative offset x -= box.x y -= box.y // move every point if (!isNaN(x) && !isNaN(y)) { for (let i = this.length - 1; i >= 0; i--) { this[i] = [this[i][0] + x, this[i][1] + y] } } return this } // Parse point string and flat array parse(array = [0, 0]) { const points = [] // if it is an array, we flatten it and therefore clone it to 1 depths if (array instanceof Array) { array = Array.prototype.concat.apply([], array) } else { // Else, it is considered as a string // parse points array = array.trim().split(delimiter).map(parseFloat) } // validate points - https://svgwg.org/svg2-draft/shapes.html#DataTypePoints // Odd number of coordinates is an error. In such cases, drop the last odd coordinate. if (array.length % 2 !== 0) array.pop() // wrap points in two-tuples for (let i = 0, len = array.length; i < len; i = i + 2) { points.push([array[i], array[i + 1]]) } return points } // Resize poly string size(width, height) { let i const box = this.bbox() // recalculate position of all points according to new size for (i = this.length - 1; i >= 0; i--) { if (box.width) this[i][0] = ((this[i][0] - box.x) * width) / box.width + box.x if (box.height) this[i][1] = ((this[i][1] - box.y) * height) / box.height + box.y } return this } // Convert array to line object toLine() { return { x1: this[0][0], y1: this[0][1], x2: this[1][0], y2: this[1][1] } } // Convert array to string toString() { const array = [] // convert to a poly point string for (let i = 0, il = this.length; i < il; i++) { array.push(this[i].join(',')) } return array.join(' ') } transform(m) { return this.clone().transformO(m) } // transform points with matrix (similar to Point.transform) transformO(m) { if (!Matrix.isMatrixLike(m)) { m = new Matrix(m) } for (let i = this.length; i--; ) { // Perform the matrix multiplication const [x, y] = this[i] this[i][0] = m.a * x + m.c * y + m.e this[i][1] = m.b * x + m.d * y + m.f } return this } } svg.js-3.2.4/src/types/SVGArray.js000066400000000000000000000016511463723416200166740ustar00rootroot00000000000000import { delimiter } from '../modules/core/regex.js' export default class SVGArray extends Array { constructor(...args) { super(...args) this.init(...args) } clone() { return new this.constructor(this) } init(arr) { // This catches the case, that native map tries to create an array with new Array(1) if (typeof arr === 'number') return this this.length = 0 this.push(...this.parse(arr)) return this } // Parse whitespace separated string parse(array = []) { // If already is an array, no need to parse it if (array instanceof Array) return array return array.trim().split(delimiter).map(parseFloat) } toArray() { return Array.prototype.concat.apply([], this) } toSet() { return new Set(this) } toString() { return this.join(' ') } // Flattens the array if needed valueOf() { const ret = [] ret.push(...this) return ret } } svg.js-3.2.4/src/types/SVGNumber.js000066400000000000000000000041611463723416200170450ustar00rootroot00000000000000import { numberAndUnit } from '../modules/core/regex.js' // Module for unit conversions export default class SVGNumber { // Initialize constructor(...args) { this.init(...args) } convert(unit) { return new SVGNumber(this.value, unit) } // Divide number divide(number) { number = new SVGNumber(number) return new SVGNumber(this / number, this.unit || number.unit) } init(value, unit) { unit = Array.isArray(value) ? value[1] : unit value = Array.isArray(value) ? value[0] : value // initialize defaults this.value = 0 this.unit = unit || '' // parse value if (typeof value === 'number') { // ensure a valid numeric value this.value = isNaN(value) ? 0 : !isFinite(value) ? value < 0 ? -3.4e38 : +3.4e38 : value } else if (typeof value === 'string') { unit = value.match(numberAndUnit) if (unit) { // make value numeric this.value = parseFloat(unit[1]) // normalize if (unit[5] === '%') { this.value /= 100 } else if (unit[5] === 's') { this.value *= 1000 } // store unit this.unit = unit[5] } } else { if (value instanceof SVGNumber) { this.value = value.valueOf() this.unit = value.unit } } return this } // Subtract number minus(number) { number = new SVGNumber(number) return new SVGNumber(this - number, this.unit || number.unit) } // Add number plus(number) { number = new SVGNumber(number) return new SVGNumber(this + number, this.unit || number.unit) } // Multiply number times(number) { number = new SVGNumber(number) return new SVGNumber(this * number, this.unit || number.unit) } toArray() { return [this.value, this.unit] } toJSON() { return this.toString() } toString() { return ( (this.unit === '%' ? ~~(this.value * 1e8) / 1e6 : this.unit === 's' ? this.value / 1e3 : this.value) + this.unit ) } valueOf() { return this.value } } svg.js-3.2.4/src/utils/000077500000000000000000000000001463723416200146715ustar00rootroot00000000000000svg.js-3.2.4/src/utils/adopter.js000066400000000000000000000067251463723416200166770ustar00rootroot00000000000000import { addMethodNames } from './methods.js' import { capitalize } from './utils.js' import { svg } from '../modules/core/namespaces.js' import { globals } from '../utils/window.js' import Base from '../types/Base.js' const elements = {} export const root = '___SYMBOL___ROOT___' // Method for element creation export function create(name, ns = svg) { // create element return globals.document.createElementNS(ns, name) } export function makeInstance(element, isHTML = false) { if (element instanceof Base) return element if (typeof element === 'object') { return adopter(element) } if (element == null) { return new elements[root]() } if (typeof element === 'string' && element.charAt(0) !== '<') { return adopter(globals.document.querySelector(element)) } // Make sure, that HTML elements are created with the correct namespace const wrapper = isHTML ? globals.document.createElement('div') : create('svg') wrapper.innerHTML = element // We can use firstChild here because we know, // that the first char is < and thus an element element = adopter(wrapper.firstChild) // make sure, that element doesn't have its wrapper attached wrapper.removeChild(wrapper.firstChild) return element } export function nodeOrNew(name, node) { return node && (node instanceof globals.window.Node || (node.ownerDocument && node instanceof node.ownerDocument.defaultView.Node)) ? node : create(name) } // Adopt existing svg elements export function adopt(node) { // check for presence of node if (!node) return null // make sure a node isn't already adopted if (node.instance instanceof Base) return node.instance if (node.nodeName === '#document-fragment') { return new elements.Fragment(node) } // initialize variables let className = capitalize(node.nodeName || 'Dom') // Make sure that gradients are adopted correctly if (className === 'LinearGradient' || className === 'RadialGradient') { className = 'Gradient' // Fallback to Dom if element is not known } else if (!elements[className]) { className = 'Dom' } return new elements[className](node) } let adopter = adopt export function mockAdopt(mock = adopt) { adopter = mock } export function register(element, name = element.name, asRoot = false) { elements[name] = element if (asRoot) elements[root] = element addMethodNames(Object.getOwnPropertyNames(element.prototype)) return element } export function getClass(name) { return elements[name] } // Element id sequence let did = 1000 // Get next named element id export function eid(name) { return 'Svgjs' + capitalize(name) + did++ } // Deep new id assignment export function assignNewId(node) { // do the same for SVG child nodes as well for (let i = node.children.length - 1; i >= 0; i--) { assignNewId(node.children[i]) } if (node.id) { node.id = eid(node.nodeName) return node } return node } // Method for extending objects export function extend(modules, methods) { let key, i modules = Array.isArray(modules) ? modules : [modules] for (i = modules.length - 1; i >= 0; i--) { for (key in methods) { modules[i].prototype[key] = methods[key] } } } export function wrapWithAttrCheck(fn) { return function (...args) { const o = args[args.length - 1] if (o && o.constructor === Object && !(o instanceof Array)) { return fn.apply(this, args.slice(0, -1)).attr(o) } else { return fn.apply(this, args) } } } svg.js-3.2.4/src/utils/methods.js000066400000000000000000000011741463723416200166750ustar00rootroot00000000000000const methods = {} const names = [] export function registerMethods(name, m) { if (Array.isArray(name)) { for (const _name of name) { registerMethods(_name, m) } return } if (typeof name === 'object') { for (const _name in name) { registerMethods(_name, name[_name]) } return } addMethodNames(Object.getOwnPropertyNames(m)) methods[name] = Object.assign(methods[name] || {}, m) } export function getMethodsFor(name) { return methods[name] || {} } export function getMethodNames() { return [...new Set(names)] } export function addMethodNames(_names) { names.push(..._names) } svg.js-3.2.4/src/utils/pathParser.js000066400000000000000000000124711463723416200173450ustar00rootroot00000000000000import { isPathLetter } from '../modules/core/regex.js' import Point from '../types/Point.js' const segmentParameters = { M: 2, L: 2, H: 1, V: 1, C: 6, S: 4, Q: 4, T: 2, A: 7, Z: 0 } const pathHandlers = { M: function (c, p, p0) { p.x = p0.x = c[0] p.y = p0.y = c[1] return ['M', p.x, p.y] }, L: function (c, p) { p.x = c[0] p.y = c[1] return ['L', c[0], c[1]] }, H: function (c, p) { p.x = c[0] return ['H', c[0]] }, V: function (c, p) { p.y = c[0] return ['V', c[0]] }, C: function (c, p) { p.x = c[4] p.y = c[5] return ['C', c[0], c[1], c[2], c[3], c[4], c[5]] }, S: function (c, p) { p.x = c[2] p.y = c[3] return ['S', c[0], c[1], c[2], c[3]] }, Q: function (c, p) { p.x = c[2] p.y = c[3] return ['Q', c[0], c[1], c[2], c[3]] }, T: function (c, p) { p.x = c[0] p.y = c[1] return ['T', c[0], c[1]] }, Z: function (c, p, p0) { p.x = p0.x p.y = p0.y return ['Z'] }, A: function (c, p) { p.x = c[5] p.y = c[6] return ['A', c[0], c[1], c[2], c[3], c[4], c[5], c[6]] } } const mlhvqtcsaz = 'mlhvqtcsaz'.split('') for (let i = 0, il = mlhvqtcsaz.length; i < il; ++i) { pathHandlers[mlhvqtcsaz[i]] = (function (i) { return function (c, p, p0) { if (i === 'H') c[0] = c[0] + p.x else if (i === 'V') c[0] = c[0] + p.y else if (i === 'A') { c[5] = c[5] + p.x c[6] = c[6] + p.y } else { for (let j = 0, jl = c.length; j < jl; ++j) { c[j] = c[j] + (j % 2 ? p.y : p.x) } } return pathHandlers[i](c, p, p0) } })(mlhvqtcsaz[i].toUpperCase()) } function makeAbsolut(parser) { const command = parser.segment[0] return pathHandlers[command](parser.segment.slice(1), parser.p, parser.p0) } function segmentComplete(parser) { return ( parser.segment.length && parser.segment.length - 1 === segmentParameters[parser.segment[0].toUpperCase()] ) } function startNewSegment(parser, token) { parser.inNumber && finalizeNumber(parser, false) const pathLetter = isPathLetter.test(token) if (pathLetter) { parser.segment = [token] } else { const lastCommand = parser.lastCommand const small = lastCommand.toLowerCase() const isSmall = lastCommand === small parser.segment = [small === 'm' ? (isSmall ? 'l' : 'L') : lastCommand] } parser.inSegment = true parser.lastCommand = parser.segment[0] return pathLetter } function finalizeNumber(parser, inNumber) { if (!parser.inNumber) throw new Error('Parser Error') parser.number && parser.segment.push(parseFloat(parser.number)) parser.inNumber = inNumber parser.number = '' parser.pointSeen = false parser.hasExponent = false if (segmentComplete(parser)) { finalizeSegment(parser) } } function finalizeSegment(parser) { parser.inSegment = false if (parser.absolute) { parser.segment = makeAbsolut(parser) } parser.segments.push(parser.segment) } function isArcFlag(parser) { if (!parser.segment.length) return false const isArc = parser.segment[0].toUpperCase() === 'A' const length = parser.segment.length return isArc && (length === 4 || length === 5) } function isExponential(parser) { return parser.lastToken.toUpperCase() === 'E' } const pathDelimiters = new Set([' ', ',', '\t', '\n', '\r', '\f']) export function pathParser(d, toAbsolute = true) { let index = 0 let token = '' const parser = { segment: [], inNumber: false, number: '', lastToken: '', inSegment: false, segments: [], pointSeen: false, hasExponent: false, absolute: toAbsolute, p0: new Point(), p: new Point() } while (((parser.lastToken = token), (token = d.charAt(index++)))) { if (!parser.inSegment) { if (startNewSegment(parser, token)) { continue } } if (token === '.') { if (parser.pointSeen || parser.hasExponent) { finalizeNumber(parser, false) --index continue } parser.inNumber = true parser.pointSeen = true parser.number += token continue } if (!isNaN(parseInt(token))) { if (parser.number === '0' || isArcFlag(parser)) { parser.inNumber = true parser.number = token finalizeNumber(parser, true) continue } parser.inNumber = true parser.number += token continue } if (pathDelimiters.has(token)) { if (parser.inNumber) { finalizeNumber(parser, false) } continue } if (token === '-' || token === '+') { if (parser.inNumber && !isExponential(parser)) { finalizeNumber(parser, false) --index continue } parser.number += token parser.inNumber = true continue } if (token.toUpperCase() === 'E') { parser.number += token parser.hasExponent = true continue } if (isPathLetter.test(token)) { if (parser.inNumber) { finalizeNumber(parser, false) } else if (!segmentComplete(parser)) { throw new Error('parser Error') } else { finalizeSegment(parser) } --index } } if (parser.inNumber) { finalizeNumber(parser, false) } if (parser.inSegment && segmentComplete(parser)) { finalizeSegment(parser) } return parser.segments } svg.js-3.2.4/src/utils/utils.js000066400000000000000000000063061463723416200163740ustar00rootroot00000000000000// Map function export function map(array, block) { let i const il = array.length const result = [] for (i = 0; i < il; i++) { result.push(block(array[i])) } return result } // Filter function export function filter(array, block) { let i const il = array.length const result = [] for (i = 0; i < il; i++) { if (block(array[i])) { result.push(array[i]) } } return result } // Degrees to radians export function radians(d) { return ((d % 360) * Math.PI) / 180 } // Radians to degrees export function degrees(r) { return ((r * 180) / Math.PI) % 360 } // Convert camel cased string to dash separated export function unCamelCase(s) { return s.replace(/([A-Z])/g, function (m, g) { return '-' + g.toLowerCase() }) } // Capitalize first letter of a string export function capitalize(s) { return s.charAt(0).toUpperCase() + s.slice(1) } // Calculate proportional width and height values when necessary export function proportionalSize(element, width, height, box) { if (width == null || height == null) { box = box || element.bbox() if (width == null) { width = (box.width / box.height) * height } else if (height == null) { height = (box.height / box.width) * width } } return { width: width, height: height } } /** * This function adds support for string origins. * It searches for an origin in o.origin o.ox and o.originX. * This way, origin: {x: 'center', y: 50} can be passed as well as ox: 'center', oy: 50 **/ export function getOrigin(o, element) { const origin = o.origin // First check if origin is in ox or originX let ox = o.ox != null ? o.ox : o.originX != null ? o.originX : 'center' let oy = o.oy != null ? o.oy : o.originY != null ? o.originY : 'center' // Then check if origin was used and overwrite in that case if (origin != null) { ;[ox, oy] = Array.isArray(origin) ? origin : typeof origin === 'object' ? [origin.x, origin.y] : [origin, origin] } // Make sure to only call bbox when actually needed const condX = typeof ox === 'string' const condY = typeof oy === 'string' if (condX || condY) { const { height, width, x, y } = element.bbox() // And only overwrite if string was passed for this specific axis if (condX) { ox = ox.includes('left') ? x : ox.includes('right') ? x + width : x + width / 2 } if (condY) { oy = oy.includes('top') ? y : oy.includes('bottom') ? y + height : y + height / 2 } } // Return the origin as it is if it wasn't a string return [ox, oy] } const descriptiveElements = new Set(['desc', 'metadata', 'title']) export const isDescriptive = (element) => descriptiveElements.has(element.nodeName) export const writeDataToDom = (element, data, defaults = {}) => { const cloned = { ...data } for (const key in cloned) { if (cloned[key].valueOf() === defaults[key]) { delete cloned[key] } } if (Object.keys(cloned).length) { element.node.setAttribute('data-svgjs', JSON.stringify(cloned)) // see #428 } else { element.node.removeAttribute('data-svgjs') element.node.removeAttribute('svgjs:data') } } svg.js-3.2.4/src/utils/window.js000066400000000000000000000012311463723416200165330ustar00rootroot00000000000000export const globals = { window: typeof window === 'undefined' ? null : window, document: typeof document === 'undefined' ? null : document } export function registerWindow(win = null, doc = null) { globals.window = win globals.document = doc } const save = {} export function saveWindow() { save.window = globals.window save.document = globals.document } export function restoreWindow() { globals.window = save.window globals.document = save.document } export function withWindow(win, fn) { saveWindow() registerWindow(win, win.document) fn(win, win.document) restoreWindow() } export function getWindow() { return globals.window } svg.js-3.2.4/svg.js.d.ts000066400000000000000000001476611463723416200147650ustar00rootroot00000000000000// Type definitions for @svgdotjs version 3.x // Project: @svgdotjs/svg.js // trick to keep reference to Array build-in type declare class BuiltInArray extends Array {} // trick to have nice attribute list for CSS declare type CSSStyleName = Exclude< keyof CSSStyleDeclaration, 'parentRule' | 'length' > // create our own style declaration that includes css vars interface CSSStyleDeclarationWithVars extends CSSStyleDeclaration { [key: `--${string}`]: string } declare module '@svgdotjs/svg.js' { function SVG(): Svg /** * @param selectorOrHtml pass in a css selector or an html/svg string * @param isHTML only used if first argument is an html string. Will treat the svg/html as html and not svg */ function SVG(selectorOrHtml: QuerySelector, isHTML?: boolean): Element function SVG(el: T): SVGTypeMapping function SVG(domElement: HTMLElement): Element function eid(name: string): string function get(id: string): Element function create(name: string): any function extend(parent: object, obj: object): void function invent(config: object): any function adopt(node: HTMLElement): Element function prepare(element: HTMLElement): void function getClass(name: string): Element function on( el: Node | Window, events: string, cb: EventListener, binbind?: any, options?: AddEventListenerOptions ): void function on( el: Node | Window, events: Event[], cb: EventListener, binbind?: any, options?: AddEventListenerOptions ): void function off( el: Node | Window, events?: string, cb?: EventListener | number, options?: AddEventListenerOptions ): void function off( el: Node | Window, events?: Event[], cb?: EventListener | number, options?: AddEventListenerOptions ): void function dispatch( node: Node | Window, event: Event, data?: object, options?: object ): Event function find(query: QuerySelector): List function findOne(query: QuerySelector): Element | null function getWindow(): Window function registerWindow(win: Window, doc: Document): void function restoreWindow(): void function saveWindow(): void function withWindow( win: Window, fn: (win: Window, doc: Document) => void ): void let utils: { map(array: any[], block: Function): any filter(array: any[], block: Function): any radians(d: number): number degrees(r: number): number camelCase(s: string): string unCamelCase(s: string): string capitalize(s: string): string // proportionalSize // getOrigin } let defaults: { attrs: { 'fill-opacity': number 'stroke-opacity': number 'stroke-width': number 'stroke-linejoin': string 'stroke-linecap': string fill: string stroke: string opacity: number x: number y: number cx: number cy: number width: number height: number r: number rx: number ry: number offset: number 'stop-opacity': number 'stop-color': string 'font-size': number 'font-family': string 'text-anchor': string } timeline: { duration: number ease: string delay: number } } // let easing: { // '-'(pos: number): number; // '<>'(pos: number): number; // '>'(pos: number): number; // '<'(pos: number): number; // bezier(x1: number, y1: number, x2: number, y2: number): (t: number) => number; // steps(steps: number, stepPosition?: "jump-start"|"jump-end"|"jump-none"|"jump-both"|"start"|"end"): (t: number, beforeFlag?: boolean) => number; // } let regex: { delimiter: RegExp dots: RegExp hex: RegExp hyphen: RegExp isBlank: RegExp isHex: RegExp isImage: RegExp isNumber: RegExp isPathLetter: RegExp isRgb: RegExp numberAndUnit: RegExp numbersWithDots: RegExp pathLetters: RegExp reference: RegExp rgb: RegExp transforms: RegExp whitespace: RegExp } let namespaces: { ns: string xmlns: string xlink: string svgjs: string } interface LinkedHTMLElement extends HTMLElement { instance: Element } // ************ Standard object/option/properties declaration ************ type AttrNumberValue = number | 'auto' /** * The SVG core attributes are all the common attributes that can be specified on any SVG element. * More information see https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/Core */ interface CoreAttr { id?: string lang?: string tabindex?: number 'xml:lang'?: string } /** * The SVG styling attributes are all the attributes that can be specified on any SVG element to apply CSS styling effects. * More information see https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/Styling */ interface StylingAttr { /** * a valid HTML class name */ class?: string /** * SVG css style string format. It all can be find here https://www.w3.org/TR/SVG/styling.html#StyleAttribute */ style?: string } /** * A global attribute that can be use with any svg element */ interface GlobalAttr extends CoreAttr, StylingAttr {} // TODO: implement SVG Presentation Attributes. See https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/Presentation interface PathBaseAttr { pathLength?: number } interface RadiusAxisAttr { rx?: AttrNumberValue ry?: AttrNumberValue } /** * SVG Rectangle attribute, more information see https://developer.mozilla.org/en-US/docs/Web/SVG/Element/rect */ interface RectAttr extends RadiusAxisAttr, PathBaseAttr, GlobalAttr { x?: number y?: number width: AttrNumberValue height: AttrNumberValue } /** * SVG Line attribute, more information see https://developer.mozilla.org/en-US/docs/Web/SVG/Element/line */ interface LineAttr extends PathBaseAttr, GlobalAttr { x1?: number y1?: number x2?: number y2?: number } /** * SVG Circle attribute, more information see https://developer.mozilla.org/en-US/docs/Web/SVG/Element/circle */ interface CircleAttr extends PathBaseAttr, GlobalAttr { cx?: number | string cy?: number | string r?: number | string } /** * SVG Ellipse attribute, more information see https://developer.mozilla.org/en-US/docs/Web/SVG/Element/ellipse */ interface EllipseAttr extends PathBaseAttr, GlobalAttr { cx?: number | string cy?: number | string rx?: number | string ry?: number | string } /** * SVG Path attribute, more information see https://developer.mozilla.org/en-US/docs/Web/SVG/Element/path */ interface PathAttr extends PathBaseAttr, GlobalAttr { d?: string } /** * SVG Path attribute, more information see https://developer.mozilla.org/en-US/docs/Web/SVG/Element/polygon * or https://developer.mozilla.org/en-US/docs/Web/SVG/Element/polyline */ interface PolyAttr extends PathBaseAttr, GlobalAttr { points?: string } /** * SVG Text attribute, more information see https://developer.mozilla.org/en-US/docs/Web/SVG/Element/text */ interface TextAttr extends GlobalAttr { x?: number | string y?: number | string dx?: number | string dy?: number | string lengthAdjust?: 'spacing' | 'spacingAndGlyphs' textLength?: number | string // see https://developer.mozilla.org/en-US/docs/Web/API/SVGNumberList // or https://developer.mozilla.org/en-US/docs/Web/SVG/Content_type#List-of-Ts // TODO: tbd // rotate?: string } /** * SVG TextPath attribute, more information see https://developer.mozilla.org/en-US/docs/Web/SVG/Element/textPath */ interface TextPathAttr extends GlobalAttr { href?: string lengthAdjust?: 'spacing' | 'spacingAndGlyphs' method?: 'align' | 'stretch' side?: 'left' | 'right' spacing?: 'auto' | 'exact' startOffset?: number | string textLength?: number | string // See https://developer.mozilla.org/en-US/docs/Web/SVG/Element/textPath // TODO: tbd as there is no reference to see the detail of how it would look like // path?: string } /** * A generic Dom Box object. * Notice: DOMRect is still in experiment state and document is not complete (Draft) * See https://developer.mozilla.org/en-US/docs/Web/API/DOMRect */ interface DOMRect { x?: number y?: number width?: number height?: number top?: number right?: number bottom?: number left?: number } // ************ SVG.JS generic Conditional Types declaration ************ type SVGTypeMapping = T extends HTMLElement ? Dom : T extends SVGSVGElement ? Svg : T extends SVGRectElement ? Rect : T extends SVGCircleElement ? Circle : T extends SVGPathElement ? Path : T extends SVGTextElement ? Text : T extends SVGTextPathElement ? TextPath : T extends SVGGElement ? G : T extends SVGLineElement ? Line : T extends SVGPolylineElement ? Polyline : T extends SVGPolygonElement ? Polygon : T extends SVGGradientElement ? Gradient : T extends SVGImageElement ? Image : T extends SVGEllipseElement ? Ellipse : T extends SVGMaskElement ? Mask : T extends SVGMarkerElement ? Marker : T extends SVGClipPathElement ? ClipPath : T extends SVGTSpanElement ? Tspan : T extends SVGSymbolElement ? Symbol : T extends SVGUseElement ? Use : Element // element type as string type SvgType = 'svg' type ClipPathType = 'clipPath' type TextType = 'text' type GType = 'g' type AType = 'a' type ParentElement = SvgType | GType | AType type AttrTypeMapping = T extends Rect ? RectAttr : GlobalAttr type ElementAlias = | Dom | Svg | Rect | Line | Polygon | Polyline | Ellipse | ClipPath | Use | Text | Path | TextPath | Circle | G | Gradient | Image | Element type ElementTypeAlias = | typeof Dom | typeof Svg | typeof Rect | typeof Line | typeof Polygon | typeof Polyline | typeof Ellipse | typeof ClipPath | typeof Use | typeof Text | typeof Path | typeof TextPath | typeof Circle | typeof G | typeof Gradient | typeof Image | typeof Element type AttributeReference = | 'href' | 'marker-start' | 'marker-mid' | 'marker-end' | 'mask' | 'clip-path' | 'filter' | 'fill' // ************* SVG.JS Type Declaration ************* // ********** Locate in directory src/types ********** // SVGArray.js // Notice: below class is defined the name as `Array` rather than `SVGArray`. // The purpose of giving the name as `Array` is to allow it to be aligned with SVG.JS export type // as SVG.JS export it as `Array` (to be precise `SVG.Array`) so reading through JS documentation // should be more straightforward. /** * Type alias to native array. * * **Caution**: If argument is a string, generic type must be a number or array of number and * the string is format as a concatenate of number separate by comma. * This is expensive to build runtime type check for such as case so please use it carefully. */ type ArrayAlias = BuiltInArray | T[] | string class Array extends BuiltInArray { constructor(array?: ArrayAlias) /** * Return array of generic T however it's flatten array by 1 level as it using `apply` function. * For example: if T is a `number[]` which is the number of 2 dimension `Array` the result will be `number[]` */ toArray(): any[] /** * return a concatenated string of each element separated by space */ toString(): string valueOf(): T[] clone(): Array toSet(): Set parse(a?: ArrayAlias): T[] to(a: any): Morphable } // point.js class Point { x: number y: number constructor() constructor(position: CoordinateXY) constructor(point: Point) constructor(x: number, y?: number) clone(): Point transform(matrix: Matrix): this transformO(matrix: Matrix): this toArray(): ArrayXY } // pointArray.js class PointArray extends Array { constructor() constructor(array?: ArrayAlias | number[]) toLine(): LineAttr transform(m: Matrix | MatrixLike): PointArray move(x: number, y: number): this size(width: number, height: number): this bbox(): Box to(a: any): Morphable toString(): string } // SVGNumber.js type NumberUnit = [number, string] class Number { constructor() constructor(value: Number) constructor(value: string) constructor(value: number, unit?: any) constructor(n: NumberUnit) value: number unit: any toString(): string toJSON(): object // same as toString toArray(): NumberUnit valueOf(): number plus(number: NumberAlias): Number minus(number: NumberAlias): Number times(number: NumberAlias): Number divide(number: NumberAlias): Number convert(unit: string): Number to(a: any): Morphable } type NumberAlias = Number | number | string // PathArray.js type LineCommand = | ['M' | 'm' | 'L' | 'l', number, number] | ['H' | 'h' | 'V' | 'v', number] | ['Z' | 'z'] type CurveCommand = // Bezier Curves | ['C' | 'c', number, number, number, number, number, number] | ['S' | 's' | 'Q' | 'q', number, number, number, number] | ['T' | 't', number, number] // Arcs | ['A' | 'a', number, number, number, number, number, number, number] type PathCommand = LineCommand | CurveCommand type PathArrayAlias = PathArray | PathCommand[] | (string | number)[] | string class PathArray extends Array { constructor() constructor(d: ArrayAlias | PathArrayAlias) move(x: number, y: number): this size(width: number, height: number): this equalCommands(other: PathArray): boolean morph(pa: PathArray): this parse(array?: ArrayAlias | PathArrayAlias): PathCommand[] bbox(): Box to(a: any): Morphable } // Matrix.js interface TransformData { origin?: number[] scaleX?: number scaleY?: number shear?: number rotate?: number translateX?: number translateY?: number originX?: number originY?: number } interface MatrixLike { a?: number b?: number c?: number d?: number e?: number f?: number } interface MatrixExtract extends TransformData, MatrixLike {} type FlipType = 'both' | 'x' | 'y' | boolean type ArrayXY = [number, number] type CoordinateXY = ArrayXY | { x: number; y: number } interface MatrixTransformParam { rotate?: number flip?: FlipType skew?: ArrayXY | number skewX?: number skewY?: number scale?: ArrayXY | number scaleX?: number scaleY?: number shear?: number theta?: number origin?: CoordinateXY | string around?: CoordinateXY ox?: number originX?: number oy?: number originY?: number position?: CoordinateXY px?: number positionX?: number py?: number positionY?: number translate?: CoordinateXY tx?: number translateX?: number ty?: number translateY?: number relative?: CoordinateXY rx?: number relativeX?: number ry?: number relativeY?: number } type MatrixAlias = | MatrixLike | TransformData | MatrixTransformParam | number[] | Element | string class Matrix implements MatrixLike { constructor() constructor(source: MatrixAlias) constructor( a: number, b: number, c: number, d: number, e: number, f: number ) a: number b: number c: number d: number e: number f: number; // *** To Be use by Test Only in restrict mode *** [key: string]: any clone(): Matrix transform(o: MatrixLike | MatrixTransformParam): Matrix compose(o: MatrixExtract): Matrix decompose(cx?: number, cy?: number): MatrixExtract multiply(m: MatrixAlias | Matrix): Matrix multiplyO(m: MatrixAlias | Matrix): this lmultiply(m: MatrixAlias | Matrix): Matrix lmultiplyO(m: MatrixAlias | Matrix): this inverse(): Matrix inverseO(): this translate(x?: number, y?: number): Matrix translateO(x?: number, y?: number): this scale(x: number, y?: number, cx?: number, cy?: number): Matrix scaleO(x: number, y?: number, cx?: number, cy?: number): this rotate(r: number, cx?: number, cy?: number): Matrix rotateO(r: number, cx?: number, cy?: number): this flip(a: NumberAlias, offset?: number): Matrix flipO(a: NumberAlias, offset?: number): this flip(offset?: number): Matrix shear(a: number, cx?: number, cy?: number): Matrix shearO(a: number, cx?: number, cy?: number): this skew(y?: number, cx?: number, cy?: number): Matrix skewO(y?: number, cx?: number, cy?: number): this skew(x: number, y?: number, cx?: number, cy?: number): Matrix skewX(x: number, cx?: number, cy?: number): Matrix skewY(y: number, cx?: number, cy?: number): Matrix around(cx?: number, cy?: number, matrix?: Matrix): Matrix aroundO(cx?: number, cy?: number, matrix?: Matrix): this equals(m: Matrix): boolean toString(): string toArray(): number[] valueOf(): MatrixLike to(a: any): Morphable } type ListEachCallback = (el: T, index: number, list: List) => any // List.js class List extends BuiltInArray { each(fn: ListEachCallback): List each(name: string, ...args: any[]): List toArray(): T[] } class Eventobject { [key: string]: Eventobject } // EventTarget.js class EventTarget { events: Eventobject addEventListener(): void dispatch(event: Event | string, data?: object): Event dispatchEvent(event: Event): boolean fire(event: Event | string, data?: object): this getEventHolder(): this | Node getEventTarget(): this | Node on( events: string | Event[], cb: EventListener, binbind?: any, options?: AddEventListenerOptions ): this off( events?: string | Event[], cb?: EventListener | number, options?: AddEventListenerOptions ): this removeEventListener(): void } // Color.js interface ColorLike { r: number g: number b: number x: number y: number z: number h: number s: number l: number a: number c: number m: number k: number space: string } type ColorAlias = string | ColorLike class Color implements ColorLike { r: number g: number b: number x: number y: number z: number h: number s: number l: number a: number c: number m: number k: number space: string constructor() constructor(color: ColorAlias, space?: string) constructor(a: number, b: number, c: number, space?: string) constructor(a: number, b: number, c: number, d: number, space?: string) constructor(a: number[], space?: string) rgb(): Color lab(): Color xyz(): Color lch(): Color hsl(): Color cmyk(): Color toHex(): string toString(): string toRgb(): string toArray(): any[] to(a: any): Morphable fromArray(a: any): this static random(mode: 'sine', time?: number): Color static random(mode?: string): Color } // Box.js interface BoxLike { height: number width: number y: number x: number cx?: number cy?: number w?: number h?: number x2?: number y2?: number } class Box implements BoxLike { height: number width: number y: number x: number cx: number cy: number w: number h: number x2: number y2: number constructor() constructor(source: string) constructor(source: number[]) constructor(source: DOMRect) constructor(x: number, y: number, width: number, height: number) merge(box: BoxLike): Box transform(m: Matrix): Box addOffset(): this toString(): string toArray(): number[] isNulled(): boolean to(v: MorphValueLike): Morphable } // Morphable.js type MorphValueLike = | string | number | objectBag | NonMorphable | MatrixExtract | Array | any[] class Morphable { constructor() constructor(st: Stepper) from(): MorphValueLike from(v: MorphValueLike): this to(): MorphValueLike to(v: MorphValueLike): this type(): any type(t: any): this stepper(): Stepper stepper(st: Stepper): this done(): boolean at(pos: number): any } class objectBag { constructor() constructor(a: object) valueOf(): object toArray(): object[] to(a: object): Morphable fromArray(a: any[]): this } class NonMorphable { constructor(a: object) valueOf(): object toArray(): object[] to(a: object): Morphable fromArray(a: object): this } class TransformBag { constructor() constructor(a: number[]) constructor(a: TransformData) defaults: TransformData toArray(): number[] to(t: TransformData): Morphable fromArray(t: number[]): this } interface Stepper { done(c?: object): boolean } class Ease implements Stepper { constructor() constructor(fn: string) constructor(fn: Function) step(from: number, to: number, pos: number): number done(): boolean } class Controller implements Stepper { constructor(fn?: Function) step(current: number, target: number, dt: number, c: number): number done(c?: object): boolean } // Queue.js interface QueueParam { value: any next?: any prev?: any } class Queue { constructor() push(value: any): QueueParam shift(): any first(): number last(): number remove(item: QueueParam): void } // Timeline.js interface ScheduledRunnerInfo { start: number duration: number end: number runner: Runner } class Timeline extends EventTarget { constructor() constructor(fn: Function) active(): boolean schedule(runner: Runner, delay?: number, when?: string): this schedule(): ScheduledRunnerInfo[] unschedule(runner: Runner): this getEndTime(): number updateTime(): this persist(dtOrForever?: number | boolean): this play(): this pause(): this stop(): this finish(): this speed(speed: number): this reverse(yes: boolean): this seek(dt: number): this time(): number time(time: number): this source(): Function source(fn: Function): this } // Runner.js interface TimesParam { duration: number delay: number when: number | string swing: boolean wait: number times: number } type TimeLike = number | TimesParam | Stepper type EasingCallback = (...any: any) => number type EasingLiteral = '<>' | '-' | '<' | '>' class Runner { constructor() constructor(options: Function) constructor(options: number) constructor(options: Controller) static sanitise: ( duration?: TimeLike, delay?: number, when?: string ) => object element(): Element element(el: Element): this timeline(): Timeline timeline(timeline: Timeline): this animate(duration?: TimeLike, delay?: number, when?: string): this schedule(delay: number, when?: string): this schedule(timeline: Timeline, delay?: number, when?: string): this unschedule(): this loop(times?: number, swing?: boolean, wait?: number): this loop(times: TimesParam): this delay(delay: number): this during(fn: Function): this queue( initFn: Function, runFn: Function, retargetFn?: boolean | Function, isTransform?: boolean ): this after(fn: EventListener): this time(): number time(time: number): this duration(): number loops(): number loops(p: number): this persist(dtOrForever?: number | boolean): this position(): number position(p: number): this progress(): number progress(p: number): this step(deta?: number): this reset(): this finish(): this reverse(r?: boolean): this ease(fn: EasingCallback): this ease(kind: EasingLiteral): this active(): boolean active(a: boolean): this addTransform(m: Matrix): this clearTransform(): this clearTransformsFromQueue(): void // extends prototypes attr(a: string | object, v?: string): this css(s: string | object, v?: string): this styleAttr(type: string, name: string | object, val?: string): this zoom(level: NumberAlias, point?: Point): this transform( transforms: MatrixTransformParam, relative?: boolean, affine?: boolean ): this x(x: number): this y(y: number): this ax(x: number): this ay(y: number): this dx(dx: number): this dy(dy: number): this cx(x: number): this cy(y: number): this dmove(dx: number, dy: number): this move(x: number, y: number): this amove(x: number, y: number): this center(x: number, y: number): this size(width: number, height: number): this width(width: number): this height(height: number): this plot(a: object): this plot(a: number, b: number, c: number, d: number): this leading(value: number): this viewbox(x: number, y: number, width: number, height: number): this update(offset: number, color: number, opacity: number): this update(o: StopProperties): this rx(): number rx(rx: number): this ry(): number ry(ry: number): this from(x: NumberAlias, y: NumberAlias): this to(x: NumberAlias, y: NumberAlias): this fill(): string fill(fill: FillData): this fill(color: string): this fill(pattern: Element): this fill(image: Image): this stroke(): string stroke(stroke: StrokeData): this stroke(color: string): this matrix(): Matrix matrix( a: number, b: number, c: number, d: number, e: number, f: number ): this matrix(mat: MatrixAlias): this rotate(degrees: number, cx?: number, cy?: number): this skew(skewX?: number, skewY?: number, cx?: number, cy?: number): this scale(scaleX?: number, scaleY?: number, cx?: number, cy?: number): this translate(x: number, y: number): this shear(lam: number, cx: number, cy: number): this relative(x: number, y: number): this flip(direction?: string, around?: number): this flip(around: number): this opacity(): number opacity(value: number): this font(a: string): string font(a: string, v: string | number): this font(a: object): this } // Animator.js let Animator: { nextDraw: any frames: Queue timeouts: Queue immediates: Queue timer(): boolean frame(fn: Function): object timeout(fn: Function, delay?: number): object immediate(fn: Function): object cancelFrame(o: object): void clearTimeout(o: object): void cancelImmediate(o: object): void } /** * Just fancy type alias to refer to css query selector. */ type QuerySelector = string class Dom extends EventTarget { node: HTMLElement | SVGElement type: string constructor(node?: HTMLElement, attr?: object) constructor(att: object) add(element: Element, i?: number): this addTo(parent: Dom | HTMLElement | string, i?: number): this children(): List clear(): this clone(deep?: boolean, assignNewIds?: boolean): this each( block: (index: number, children: Element[]) => void, deep?: boolean ): this element(element: string, inherit?: object): this first(): Element get(i: number): Element getEventHolder(): LinkedHTMLElement getEventTarget(): LinkedHTMLElement has(element: Element): boolean id(): string id(id: string): this index(element: Element): number last(): Element matches(selector: string): boolean /** * Finds the closest ancestor which matches the string or is of passed type. If nothing is passed, the parent is returned * @param type can be either string, svg.js object or undefined. */ parent(type?: ElementTypeAlias | QuerySelector): Dom | null put(element: Element, i?: number): Element /** * Put the element into the given parent element and returns the parent element * @param parent The parent in which the current element is inserted */ putIn(parent: ElementAlias | Node | QuerySelector): Dom remove(): this removeElement(element: Element): this replace(element: T): T round(precision?: number, map?: string[]): this svg(): string svg(a: string, outer: true): Element svg(a: string, outer?: false): this svg(a: boolean, outer?: boolean): string svg(a: null | Function, outer?: boolean): string toString(): string words(text: string): this writeDataToDom(): this // prototype extend Attribute in attr.js /** * Get the attribute object of SVG Element. The return object will be vary based on * the instance itself. For example, G element will only return GlobalAttr where Rect * will return RectAttr instead. */ attr(): any /** * Add or update the attribute from the SVG Element. To remove the attribute from the element set value to null * @param name name of attribute * @param value value of attribute can be string or number or null * @param namespace optional string that define namespace */ attr(name: string, value: any, namespace?: string): this attr(name: string): any attr(obj: object): this attr(obj: string[]): object // prototype extend Selector in selector.js find(query: string): List findOne(query: string): Dom | null // prototype method register in data.js data(a: string): object | string | number data(a: string, v: object, substain?: boolean): this data(a: object): this // prototype method register in arrange.js siblings(): List position(): number next(): Element prev(): Element forward(): this backward(): this front(): this back(): this before(el: Element): Element after(el: Element): Element insertBefore(el: Element): this insertAfter(el: Element): this // prototype method register in class.js classes(): string[] hasClass(name: string): boolean addClass(name: string): this removeClass(name: string): this toggleClass(name: string): this // prototype method register in css.js css(): Partial css(style: T): CSSStyleDeclarationWithVars[T] css( style: T ): Partial css( style: T, val: CSSStyleDeclarationWithVars[T] ): this css(style: Partial): this show(): this hide(): this visible(): boolean // memory.js remember(name: string, value: any): this remember(name: string): any remember(obj: object): this forget(...keys: string[]): this forget(): this memory(): object addEventListener(): void dispatch(event: Event | string, data?: object): Event dispatchEvent(event: Event): boolean fire(event: Event | string, data?: object): this getEventHolder(): this | Node getEventTarget(): this | Node // on(events: string | Event[], cb: EventListener, binbind?: any, options?: AddEventListenerOptions): this; // off(events?: string | Event[], cb?: EventListener | number): this; removeEventListener(): void } // clip.js class ClipPath extends Container { constructor() constructor(node?: SVGClipPathElement) constructor(attr: object) node: SVGClipPathElement targets(): List remove(): this } // container.js interface ViewBoxLike { x: number y: number width: number height: number } class Containable { circle(size?: NumberAlias): Circle clip(): ClipPath ellipse(width?: number, height?: number): Ellipse foreignObject(width: number, height: number): ForeignObject gradient(type: string, block?: (stop: Gradient) => void): Gradient group(): G image(): Image image(href?: string, callback?: (e: Event) => void): Image line(points?: PointArrayAlias): Line line(x1: number, y1: number, x2: number, y2: number): Line link(url: string): A marker( width?: number, height?: number, block?: (marker: Marker) => void ): Marker mask(): Mask nested(): Svg path(): Path path(d: PathArrayAlias): Path pattern( width?: number, height?: number, block?: (pattern: Pattern) => void ): Pattern plain(text: string): Text polygon(points?: PointArrayAlias): Polygon polyline(points?: PointArrayAlias): Polyline rect(width?: NumberAlias, height?: NumberAlias): Rect style(): Style text(block: (tspan: Tspan) => void): Text text(text: string): Text use(element: Element | string, file?: string): Use viewbox(): Box viewbox(viewbox: ViewBoxLike | string): this viewbox(x: number, y: number, width: number, height: number): this textPath(text: string | Text, path: string | Path): TextPath symbol(): Symbol zoom(): number zoom(level: NumberAlias, point?: Point): this } type DynamicExtends = { new (...args: any[]): Containable & T } /** * only for declaration purpose. actually cannot be used. */ let ContainableDom: DynamicExtends class Fragment extends ContainableDom { constructor(node?: Node) } /** * only for declaration purpose. actually cannot be used. */ let ContainableElement: DynamicExtends class Container extends ContainableElement { constructor() flatten(parent: Dom, depth?: number): this ungroup(parent: Dom, depth?: number): this } class Defs extends Container { constructor(node?: SVGDefsElement) node: SVGDefsElement marker( width?: number, height?: number, block?: (marker: Marker) => void ): Marker } class Svg extends Container { constructor(svgElement?: SVGSVGElement) constructor(id: string) node: SVGSVGElement namespace(): this defs(): Defs remove(): this isRoot(): boolean } type EventHandler = (event: T) => void interface Sugar { fill(): string fill(fill: FillData): this fill(color: string): this fill(pattern: Element): this fill(image: Image): this stroke(): string stroke(stroke: StrokeData): this stroke(color: string): this matrix(): Matrix matrix( a: number, b: number, c: number, d: number, e: number, f: number ): this matrix(mat: MatrixAlias): this rotate(degrees: number, cx?: number, cy?: number): this skew(skewX?: number, skewY?: number, cx?: number, cy?: number): this scale(scaleX?: number, scaleY?: number, cx?: number, cy?: number): this translate(x: number, y: number): this shear(lam: number, cx: number, cy: number): this relative(x: number, y: number): this flip(direction?: string, around?: number): this flip(around: number): this opacity(): number opacity(value: number): this font(a: string): string font(a: string, v: string | number): this font(a: object): this click(cb: EventHandler): this dblclick(cb: EventHandler): this mousedown(cb: EventHandler): this mouseup(cb: EventHandler): this mouseover(cb: EventHandler): this mouseout(cb: EventHandler): this mousemove(cb: EventHandler): this mouseenter(cb: EventHandler): this mouseleave(cb: EventHandler): this touchstart(cb: EventHandler): this touchmove(cb: EventHandler): this touchleave(cb: EventHandler): this touchend(cb: EventHandler): this touchcancel(cb: EventHandler): this contextmenu(cb: EventHandler): this wheel(cb: EventHandler): this pointerdown(cb: EventHandler): this pointermove(cb: EventHandler): this pointerup(cb: EventHandler): this pointerleave(cb: EventHandler): this pointercancel(cb: EventHandler): this } // Symbol.js class Symbol extends Container { constructor(svgElement?: SVGSymbolElement) constructor(attr: object) node: SVGSymbolElement } class Element extends Dom implements Sugar { constructor(node?: SVGElement) constructor(attr: object) node: SVGElement type: string dom: any addClass(name: string): this after(element: Element): Element animate(duration?: TimeLike, delay?: number, when?: string): Runner delay(by: number, when?: string): Runner attr(): any attr(name: string, value: any, namespace?: string): this attr(name: string): any attr(obj: string[]): object attr(obj: object): this back(): this backward(): this bbox(): Box before(element: Element): Element center(x: number, y: number): this classes(): string[] clipper(): ClipPath clipWith(element: Element): this clone(deep?: boolean, assignNewIds?: boolean): this ctm(): Matrix cx(): number cx(x: number): this cy(): number cy(y: number): this data(name: string, value: any, sustain?: boolean): this data(name: string): any data(val: object): this defs(): Defs dmove(x: NumberAlias, y: NumberAlias): this dx(x: NumberAlias): this dy(y: NumberAlias): this event(): Event | CustomEvent fire(event: Event): this fire(event: string, data?: any): this forget(...keys: string[]): this forget(): this forward(): this front(): this hasClass(name: string): boolean height(): NumberAlias height(height: NumberAlias): this hide(): this hide(): this id(): string id(id: string): this inside(x: number, y: number): boolean is(cls: any): boolean linkTo(url: (link: A) => void): A linkTo(url: string): A masker(): Mask maskWith(element: Element): this maskWith(mask: Mask): this matches(selector: string): boolean matrixify(): Matrix memory(): object move(x: NumberAlias, y: NumberAlias): this native(): LinkedHTMLElement next(): Element // off(events?: string | Event[], cb?: EventListener | number): this; // on(event: string, cb: Function, context?: object): this; toRoot(): Svg /** * By default parents will return a list of elements up until the root svg. */ parents(): List /** * List the parent by hierarchy until the given parent type or matcher. If the given value is null * then the result is only provided the list up until Svg root element which mean no Dom parent element is included. * @param util a parent type */ parents(util: QuerySelector | T | null): List /** * Get reference svg element based on the given attribute. * @param attr a svg attribute */ reference(attr: AttributeReference): R | null point(): Point point(position: CoordinateXY): Point point(point: Point): Point point(x: number, y: number): Point position(): number prev(): Element rbox(element?: Element): Box reference(type: string): Element remember(name: string, value: any): this remember(name: string): any remember(obj: object): this remove(): this removeClass(name: string): this root(): Svg screenCTM(): Matrix setData(data: object): this show(): this show(): this size(width?: NumberAlias, height?: NumberAlias): this stop(jumpToEnd: boolean, clearQueue: boolean): Animation stop( offset?: NumberAlias | string, color?: NumberAlias, opacity?: NumberAlias ): Stop stop(val: { offset?: NumberAlias | string color?: NumberAlias opacity?: NumberAlias }): Stop timeline(): Timeline timeline(tl: Timeline): this toggleClass(name: string): this toParent(parent: Dom): this toParent(parent: Dom, i: number): this toSvg(): this transform(): MatrixExtract transform(t: MatrixAlias, relative?: boolean): this unclip(): this unmask(): this untransform(): this visible(): boolean width(): NumberAlias width(width: NumberAlias): this x(): NumberAlias x(x: NumberAlias): this y(): NumberAlias y(y: NumberAlias): this fill(): string fill(fill: FillData): this fill(color: string): this fill(pattern: Element): this fill(image: Image): this stroke(): string stroke(stroke: StrokeData): this stroke(color: string): this matrix(): Matrix matrix( a: number, b: number, c: number, d: number, e: number, f: number ): this matrix(mat: MatrixAlias): this rotate(degrees: number, cx?: number, cy?: number): this skew(skewX?: number, skewY?: number, cx?: number, cy?: number): this scale(scaleX?: number, scaleY?: number, cx?: number, cy?: number): this translate(x: number, y: number): this shear(lam: number, cx: number, cy: number): this relative(x: number, y: number): this flip(direction?: string, around?: number): this flip(around: number): this opacity(): number opacity(value: number): this font(a: string): string font(a: string, v: string | number): this font(a: object): this click(cb: EventHandler): this dblclick(cb: EventHandler): this mousedown(cb: EventHandler): this mouseup(cb: EventHandler): this mouseover(cb: EventHandler): this mouseout(cb: EventHandler): this mousemove(cb: EventHandler): this mouseenter(cb: EventHandler): this mouseleave(cb: EventHandler): this touchstart(cb: EventHandler): this touchmove(cb: EventHandler): this touchleave(cb: EventHandler): this touchend(cb: EventHandler): this touchcancel(cb: EventHandler): this contextmenu(cb: EventHandler): this wheel(cb: EventHandler): this pointerdown(cb: EventHandler): this pointermove(cb: EventHandler): this pointerup(cb: EventHandler): this pointerleave(cb: EventHandler): this pointercancel(cb: EventHandler): this } // ellipse.js interface CircleMethods extends Shape { rx(rx: number): this rx(): this ry(ry: number): this ry(): this radius(x: number, y?: number): this } class Circle extends Shape implements CircleMethods { constructor(node?: SVGCircleElement) constructor(attr: CircleAttr) node: SVGCircleElement rx(rx: number): this rx(): this ry(ry: number): this ry(): this radius(x: number, y?: number): this } class Ellipse extends Shape implements CircleMethods { node: SVGEllipseElement constructor(attr: EllipseAttr) constructor(node?: SVGEllipseElement) rx(rx: number): this rx(): this ry(ry: number): this ry(): this radius(x: number, y?: number): this } interface StopProperties { color?: ColorAlias offset?: number | string opacity?: number } // gradient.js class Stop extends Element { update(offset?: number, color?: ColorAlias, opacity?: number): this update(opts: StopProperties): this } class Gradient extends Container { constructor(node?: SVGGradientElement) constructor(attr: object) constructor(type: string) node: SVGGradientElement at(offset?: number, color?: ColorAlias, opacity?: number): Stop at(opts: StopProperties): Stop url(): string toString(): string targets(): List bbox(): Box // gradiented.js from(x: number, y: number): this to(x: number, y: number): this // TODO: check with main.js radius(x: number, y?: number): this targets(): List bbox(): Box update(block?: (gradient: Gradient) => void): this } // group.js class G extends Container { constructor(node?: SVGGElement) constructor(attr: object) node: SVGGElement gbox(): Box } // hyperlink.js class A extends Container { constructor(node?: SVGAElement) constructor(attr: object) node: SVGAElement to(url: string): this to(): string target(target: string): this target(): string } // ForeignObject.js class ForeignObject extends Element { constructor(node?: SVGForeignObjectElement, attrs?: object) constructor(attrs?: object) add(element: Dom, i?: number): this } // image.js class Image extends Shape { constructor(node?: SVGImageElement) constructor(attr: object) node: SVGImageElement load(url?: string, callback?: (event: Event) => void): this } // line.js type PointArrayAlias = number[] | ArrayXY[] | PointArray | string class Line extends Shape { constructor(attr: LineAttr) constructor(node?: SVGLineElement) node: SVGLineElement array(): PointArray plot(): PointArray plot(points?: PointArrayAlias): this plot(x1: number, y1: number, x2: number, y2: number): this move(x: number, y: number): this size(width?: number, height?: number): this marker( position: string, width?: number, height?: number, block?: (marker: Marker) => void ): Marker marker(position: string, marker: Marker): Marker } // marker.js // TODO: check register method marker class Marker extends Container { constructor() node: SVGMarkerElement ref(x: string | number, y: string | number): this update(block: (marker: Marker) => void): this toString(): string orient(orientation: 'auto' | 'auto-start-reverse' | number | Number): this orient(): string } // mask.js class Mask extends Container { constructor(node?: SVGMaskElement) constructor(attr: object) node: SVGMaskElement remove(): this targets(): List } // path.js class Path extends Shape { constructor(attr: PathAttr) constructor(node?: SVGPathElement) node: SVGPathElement morphArray: PathArray array(): PathArray plot(): PathArray plot(d: PathArrayAlias): this marker( position: string, width?: number, height?: number, block?: (marker: Marker) => void ): this marker(position: string, marker: Marker): this // sugar.js length(): number pointAt(length: number): { x: number; y: number } text(text: string): TextPath text(text: Text): TextPath targets(): List } // pattern.js class Pattern extends Container { url(): string url(...rest: any[]): never update(block: (pattern: Pattern) => void): this toString(): string } // poly.js interface poly { array(): PointArray plot(): PointArray plot(p: PointArrayAlias): this clear(): this move(x: number, y: number): this size(width: number, height?: number): this } // pointed.js interface pointed { x(): number x(x: number): this y(): number y(y: number): this height(): number height(h: number): this width(): number width(w: number): this } class Polyline extends Shape implements poly, pointed { constructor(node?: SVGPolylineElement) constructor(attr: PolyAttr) node: SVGPolylineElement array(): PointArray plot(): PointArray plot(p: PointArrayAlias): this x(): number x(x: number): this y(): number y(y: number): this height(): number height(h: number): this width(): number width(w: number): this move(x: number, y: number): this size(width: number, height?: number): this marker( position: string, width?: number, height?: number, block?: (marker: Marker) => void ): Marker marker(position: string, marker: Marker): Marker } class Polygon extends Shape implements poly, pointed { constructor(node?: SVGPolygonElement) constructor(attr: PolyAttr) node: SVGPolygonElement array(): PointArray plot(): PointArray plot(p: PointArrayAlias): this x(): number x(x: number): this y(): number y(y: number): this height(): number height(h: number): this width(): number width(w: number): this move(x: number, y: number): this size(width: number, height?: number): this marker( position: string, width?: number, height?: number, block?: (marker: Marker) => void ): Marker marker(position: string, marker: Marker): Marker } class Rect extends Shape { constructor(node?: SVGRectElement) constructor(attr: RectAttr) node: SVGRectElement radius(x: number, y?: number): this } // shape.js class Shape extends Element {} // sugar.js interface StrokeData { color?: string width?: number opacity?: number linecap?: string linejoin?: string miterlimit?: number dasharray?: string dashoffset?: number } interface FillData { color?: string opacity?: number rule?: string } interface FontData { family?: string size?: NumberAlias anchor?: string leading?: NumberAlias weight?: string style?: string } // textable.js interface Textable { plain(text: string): this length(): number } // text.js class Text extends Shape implements Textable { constructor(node?: SVGElement) constructor(attr: TextAttr) clone(): this text(): string text(text: string): this text(block: (text: this) => void): this leading(): Number leading(leading: NumberAlias): this rebuild(enabled: boolean): this build(enabled: boolean): this clear(): this plain(text: string): this length(): number get(i: number): Tspan path(): TextPath path(d: PathArrayAlias | Path): TextPath track(): Element ax(): string ax(x: string): this ay(): string ay(y: string): this amove(x: number, y: number): this textPath(): TextPath // main.js, from extend/copy prototypes from Tspan tspan(text: string): Tspan tspan(block: (tspan: Tspan) => void): this } class Tspan extends Text implements Textable { constructor(node?: SVGElement) constructor(attr: TextAttr) dx(): number dx(x: NumberAlias): this dy(): number dy(y: NumberAlias): this newLine(): this tspan(text: string): Tspan tspan(block: (tspan: Tspan) => void): this length(): number text(): string text(text: string): this text(block: (text: this) => void): this plain(text: string): this } // textpath.js class TextPath extends Text { constructor() constructor(attr: TextPathAttr) array(): Array plot(): PathArray plot(d: string): this track(): Path } // style.js class Style extends Element { constructor(node: SVGElement, attr?: StylingAttr) addText(text: string): this font(a: object): this font(a: string, v: string | number): this font(a: string): string rule(selector: string, obj: any): this } // use.js class Use extends Shape { use(element: string, file?: string): this } // viewbox.js type ViewBoxAlias = ViewBoxLike | number[] | string | Element interface ViewBox { x: number y: number width: number height: number toString(): string at(pos: number): ViewBox } } svg.js-3.2.4/tsconfig.json000066400000000000000000000000031463723416200154420ustar00rootroot00000000000000{}