svg.js-3.2.5/ 0000775 0001750 0001750 00000000000 15062036313 013132 5 ustar georgesk georgesk svg.js-3.2.5/bench/ 0000775 0001750 0001750 00000000000 15062036313 014211 5 ustar georgesk georgesk svg.js-3.2.5/bench/runner.html 0000664 0001750 0001750 00000003134 15062036313 016411 0 ustar georgesk georgesk
` 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.5]: https://github.com/svgdotjs/svg.js/releases/tag/3.2.5
[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.5/.prettierrc.json 0000664 0001750 0001750 00000000127 15062036313 016266 0 ustar georgesk georgesk {
"trailingComma": "none",
"tabWidth": 2,
"semi": false,
"singleQuote": true
}
svg.js-3.2.5/package-lock.json 0000664 0001750 0001750 00001741507 15062036313 016365 0 ustar georgesk georgesk {
"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.5/tsconfig.json 0000664 0001750 0001750 00000000003 15062036313 015632 0 ustar georgesk georgesk {}
svg.js-3.2.5/playgrounds/ 0000775 0001750 0001750 00000000000 15062036313 015501 5 ustar georgesk georgesk svg.js-3.2.5/playgrounds/matrix/ 0000775 0001750 0001750 00000000000 15062036313 017005 5 ustar georgesk georgesk svg.js-3.2.5/playgrounds/matrix/drag.js 0000664 0001750 0001750 00000003115 15062036313 020260 0 ustar georgesk georgesk function 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.5/playgrounds/matrix/index.html 0000664 0001750 0001750 00000002327 15062036313 021006 0 ustar georgesk georgesk
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.5/playgrounds/matrix/matrix.js 0000664 0001750 0001750 00000001566 15062036313 020657 0 ustar georgesk georgesk function 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.5/playgrounds/matrix/style.css 0000664 0001750 0001750 00000001613 15062036313 020660 0 ustar georgesk georgesk * {
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.5/playgrounds/colors/ 0000775 0001750 0001750 00000000000 15062036313 017002 5 ustar georgesk georgesk svg.js-3.2.5/playgrounds/colors/main.js 0000664 0001750 0001750 00000001322 15062036313 020262 0 ustar georgesk georgesk let 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.5/playgrounds/colors/index.html 0000664 0001750 0001750 00000000715 15062036313 021002 0 ustar georgesk georgesk
SVG Playground
Color Playground
Lets test the different types of random colors we can make
svg.js-3.2.5/playgrounds/colors/style.css 0000664 0001750 0001750 00000001613 15062036313 020655 0 ustar georgesk georgesk * {
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.5/playgrounds/webpack.config.js 0000664 0001750 0001750 00000001053 15062036313 020716 0 ustar georgesk georgesk var 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.5/playgrounds/transforms/ 0000775 0001750 0001750 00000000000 15062036313 017677 5 ustar georgesk georgesk svg.js-3.2.5/playgrounds/transforms/transforms.js 0000664 0001750 0001750 00000001004 15062036313 022426 0 ustar georgesk georgesk let 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.5/playgrounds/transforms/index.html 0000664 0001750 0001750 00000001041 15062036313 021670 0 ustar georgesk georgesk
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.5/playgrounds/transforms/style.css 0000664 0001750 0001750 00000001613 15062036313 021552 0 ustar georgesk georgesk * {
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.5/src/ 0000775 0001750 0001750 00000000000 15062036313 013721 5 ustar georgesk georgesk svg.js-3.2.5/src/svg.js 0000664 0001750 0001750 00000000360 15062036313 015055 0 ustar georgesk georgesk import * 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.5/src/main.js 0000664 0001750 0001750 00000013550 15062036313 015207 0 ustar georgesk georgesk /* 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.5/src/modules/ 0000775 0001750 0001750 00000000000 15062036313 015371 5 ustar georgesk georgesk svg.js-3.2.5/src/modules/core/ 0000775 0001750 0001750 00000000000 15062036313 016321 5 ustar georgesk georgesk svg.js-3.2.5/src/modules/core/parser.js 0000664 0001750 0001750 00000001321 15062036313 020150 0 ustar georgesk georgesk import { 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.5/src/modules/core/namespaces.js 0000664 0001750 0001750 00000000342 15062036313 020775 0 ustar georgesk georgesk // 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.5/src/modules/core/poly.js 0000664 0001750 0001750 00000001500 15062036313 017636 0 ustar georgesk georgesk import { 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.5/src/modules/core/defaults.js 0000664 0001750 0001750 00000001144 15062036313 020466 0 ustar georgesk georgesk export 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.5/src/modules/core/pointed.js 0000664 0001750 0001750 00000001202 15062036313 020314 0 ustar georgesk georgesk import 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.5/src/modules/core/event.js 0000664 0001750 0001750 00000007120 15062036313 020000 0 ustar georgesk georgesk import { 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.5/src/modules/core/containerGeometry.js 0000664 0001750 0001750 00000005120 15062036313 022353 0 ustar georgesk georgesk import 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.5/src/modules/core/textable.js 0000664 0001750 0001750 00000003034 15062036313 020467 0 ustar georgesk georgesk import { 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.5/src/modules/core/regex.js 0000664 0001750 0001750 00000001661 15062036313 017775 0 ustar georgesk georgesk // 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.5/src/modules/core/selector.js 0000664 0001750 0001750 00000001033 15062036313 020474 0 ustar georgesk georgesk import { 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.5/src/modules/core/gradiented.js 0000664 0001750 0001750 00000000745 15062036313 020773 0 ustar georgesk georgesk import 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.5/src/modules/core/circled.js 0000664 0001750 0001750 00000001570 15062036313 020267 0 ustar georgesk georgesk import 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.5/src/modules/core/attr.js 0000664 0001750 0001750 00000005051 15062036313 017632 0 ustar georgesk georgesk import { 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.5/src/modules/optional/ 0000775 0001750 0001750 00000000000 15062036313 017216 5 ustar georgesk georgesk svg.js-3.2.5/src/modules/optional/arrange.js 0000664 0001750 0001750 00000004115 15062036313 021174 0 ustar georgesk georgesk import { 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.5/src/modules/optional/data.js 0000664 0001750 0001750 00000002042 15062036313 020463 0 ustar georgesk georgesk import { 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.5/src/modules/optional/sugar.js 0000664 0001750 0001750 00000011071 15062036313 020675 0 ustar georgesk georgesk import { 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.5/src/modules/optional/class.js 0000664 0001750 0001750 00000002146 15062036313 020664 0 ustar georgesk georgesk import { 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.5/src/modules/optional/memory.js 0000664 0001750 0001750 00000001737 15062036313 021074 0 ustar georgesk georgesk import { 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.5/src/modules/optional/transform.js 0000664 0001750 0001750 00000004451 15062036313 021573 0 ustar georgesk georgesk import { 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.5/src/modules/optional/css.js 0000664 0001750 0001750 00000003216 15062036313 020346 0 ustar georgesk georgesk import { 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.5/src/animation/ 0000775 0001750 0001750 00000000000 15062036313 015700 5 ustar georgesk georgesk svg.js-3.2.5/src/animation/Queue.js 0000664 0001750 0001750 00000002642 15062036313 017326 0 ustar georgesk georgesk export 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.5/src/animation/Controller.js 0000664 0001750 0001750 00000012120 15062036313 020355 0 ustar georgesk georgesk import { 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.5/src/animation/Timeline.js 0000664 0001750 0001750 00000022664 15062036313 020016 0 ustar georgesk georgesk import { 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.5/src/animation/Morphable.js 0000664 0001750 0001750 00000015156 15062036313 020157 0 ustar georgesk georgesk import { 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.5/src/animation/Runner.js 0000664 0001750 0001750 00000070406 15062036313 017516 0 ustar georgesk georgesk import { 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.5/src/animation/Animator.js 0000664 0001750 0001750 00000005430 15062036313 020012 0 ustar georgesk georgesk import { 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.5/src/types/ 0000775 0001750 0001750 00000000000 15062036313 015065 5 ustar georgesk georgesk svg.js-3.2.5/src/types/List.js 0000664 0001750 0001750 00000002753 15062036313 016345 0 ustar georgesk georgesk import { 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.5/src/types/Box.js 0000664 0001750 0001750 00000016601 15062036313 016157 0 ustar georgesk georgesk import { 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.5/src/types/Color.js 0000664 0001750 0001750 00000031507 15062036313 016507 0 ustar georgesk georgesk import { 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.5/src/types/SVGArray.js 0000664 0001750 0001750 00000001651 15062036313 017064 0 ustar georgesk georgesk import { 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.5/src/types/Point.js 0000664 0001750 0001750 00000002033 15062036313 016512 0 ustar georgesk georgesk import 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.5/src/types/Matrix.js 0000664 0001750 0001750 00000031451 15062036313 016673 0 ustar georgesk georgesk import { 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.5/src/types/SVGNumber.js 0000664 0001750 0001750 00000004161 15062036313 017235 0 ustar georgesk georgesk import { 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.5/src/types/PathArray.js 0000664 0001750 0001750 00000007550 15062036313 017325 0 ustar georgesk georgesk import 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.5/src/types/Base.js 0000664 0001750 0001750 00000000414 15062036313 016274 0 ustar georgesk georgesk export 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.5/src/types/EventTarget.js 0000664 0001750 0001750 00000002135 15062036313 017654 0 ustar georgesk georgesk import { 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.5/src/types/PointArray.js 0000664 0001750 0001750 00000005554 15062036313 017524 0 ustar georgesk georgesk import { 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.5/src/polyfills/ 0000775 0001750 0001750 00000000000 15062036313 015736 5 ustar georgesk georgesk svg.js-3.2.5/src/polyfills/children.js 0000664 0001750 0001750 00000000336 15062036313 020066 0 ustar georgesk georgesk import { 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.5/src/polyfills/innerHTML.js 0000664 0001750 0001750 00000006103 15062036313 020074 0 ustar georgesk georgesk ;(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(/, '<')
.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('', node.tagName, '>')
} 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 =
"'
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 =
"'
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.5/src/elements/ 0000775 0001750 0001750 00000000000 15062036313 015535 5 ustar georgesk georgesk svg.js-3.2.5/src/elements/Defs.js 0000664 0001750 0001750 00000000502 15062036313 016751 0 ustar georgesk georgesk import { 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.5/src/elements/Use.js 0000664 0001750 0001750 00000001270 15062036313 016627 0 ustar georgesk georgesk import { 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.5/src/elements/Container.js 0000664 0001750 0001750 00000001257 15062036313 020022 0 ustar georgesk georgesk import { 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.5/src/elements/Style.js 0000664 0001750 0001750 00000002061 15062036313 017172 0 ustar georgesk georgesk import { 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.5/src/elements/Fragment.js 0000664 0001750 0001750 00000001574 15062036313 017645 0 ustar georgesk georgesk import 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.5/src/elements/Stop.js 0000664 0001750 0001750 00000001716 15062036313 017025 0 ustar georgesk georgesk import { 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.5/src/elements/Polygon.js 0000664 0001750 0001750 00000001444 15062036313 017525 0 ustar georgesk georgesk import {
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.5/src/elements/ForeignObject.js 0000664 0001750 0001750 00000001022 15062036313 020606 0 ustar georgesk georgesk import { 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.5/src/elements/Image.js 0000664 0001750 0001750 00000004035 15062036313 017117 0 ustar georgesk georgesk import { 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.5/src/elements/G.js 0000664 0001750 0001750 00000001111 15062036313 016253 0 ustar georgesk georgesk import {
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.5/src/elements/Svg.js 0000664 0001750 0001750 00000003032 15062036313 016630 0 ustar georgesk georgesk import {
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.5/src/elements/TextPath.js 0000664 0001750 0001750 00000005150 15062036313 017635 0 ustar georgesk georgesk import { 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.5/src/elements/Mask.js 0000664 0001750 0001750 00000002367 15062036313 016776 0 ustar georgesk georgesk import { 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.5/src/elements/Path.js 0000664 0001750 0001750 00000003660 15062036313 016774 0 ustar georgesk georgesk import { 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.5/src/elements/Text.js 0000664 0001750 0001750 00000007341 15062036313 017024 0 ustar georgesk georgesk import {
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.5/src/elements/Gradient.js 0000664 0001750 0001750 00000002737 15062036313 017641 0 ustar georgesk georgesk import {
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.5/src/elements/Symbol.js 0000664 0001750 0001750 00000000742 15062036313 017343 0 ustar georgesk georgesk import { 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.5/src/elements/Dom.js 0000664 0001750 0001750 00000020000 15062036313 016602 0 ustar georgesk georgesk import {
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.5/src/elements/Pattern.js 0000664 0001750 0001750 00000002710 15062036313 017510 0 ustar georgesk georgesk import { 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.5/src/elements/Element.js 0000664 0001750 0001750 00000007414 15062036313 017472 0 ustar georgesk georgesk import { 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.5/src/elements/Tspan.js 0000664 0001750 0001750 00000003707 15062036313 017167 0 ustar georgesk georgesk import {
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.5/src/elements/Rect.js 0000664 0001750 0001750 00000001146 15062036313 016772 0 ustar georgesk georgesk import {
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.5/src/elements/Circle.js 0000664 0001750 0001750 00000001661 15062036313 017300 0 ustar georgesk georgesk import { 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.5/src/elements/A.js 0000664 0001750 0001750 00000003060 15062036313 016252 0 ustar georgesk georgesk import {
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.5/src/elements/Shape.js 0000664 0001750 0001750 00000000233 15062036313 017131 0 ustar georgesk georgesk import { register } from '../utils/adopter.js'
import Element from './Element.js'
export default class Shape extends Element {}
register(Shape, 'Shape')
svg.js-3.2.5/src/elements/ClipPath.js 0000664 0001750 0001750 00000002515 15062036313 017602 0 ustar georgesk georgesk import { 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.5/src/elements/Polyline.js 0000664 0001750 0001750 00000001454 15062036313 017672 0 ustar georgesk georgesk import {
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.5/src/elements/Marker.js 0000664 0001750 0001750 00000003665 15062036313 017326 0 ustar georgesk georgesk import { 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.5/src/elements/Line.js 0000664 0001750 0001750 00000003147 15062036313 016767 0 ustar georgesk georgesk import {
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.5/src/elements/Ellipse.js 0000664 0001750 0001750 00000001606 15062036313 017473 0 ustar georgesk georgesk import {
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.5/src/utils/ 0000775 0001750 0001750 00000000000 15062036313 015061 5 ustar georgesk georgesk svg.js-3.2.5/src/utils/methods.js 0000664 0001750 0001750 00000001174 15062036313 017065 0 ustar georgesk georgesk const 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.5/src/utils/utils.js 0000664 0001750 0001750 00000006306 15062036313 016564 0 ustar georgesk georgesk // 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.5/src/utils/pathParser.js 0000664 0001750 0001750 00000012471 15062036313 017535 0 ustar georgesk georgesk import { 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.5/src/utils/window.js 0000664 0001750 0001750 00000001231 15062036313 016723 0 ustar georgesk georgesk export 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.5/src/utils/adopter.js 0000664 0001750 0001750 00000006732 15062036313 017065 0 ustar georgesk georgesk import { 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.trim().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.trim()
// We use firstElementChild here to skip potential comment nodes (#1339),
element = adopter(wrapper.firstElementChild)
// make sure, that element doesn't have its wrapper attached
wrapper.removeChild(wrapper.firstElementChild)
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.5/README.md 0000664 0001750 0001750 00000003314 15062036313 014412 0 ustar georgesk georgesk # SVG.js
[](https://travis-ci.org/svgdotjs/svg.js)
[](https://coveralls.io/github/svgdotjs/svg.js?branch=master)
[](https://cdnjs.com/libraries/svg.js)
[](https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js)
[](https://gitter.im/svgdotjs/svg.js?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
[](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.
[](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 [](https://github.com/sponsors/Fuzzyma)
svg.js-3.2.5/spec/ 0000775 0001750 0001750 00000000000 15062036313 014064 5 ustar georgesk georgesk svg.js-3.2.5/spec/runSVGDomTest.js 0000664 0001750 0001750 00000000621 15062036313 017105 0 ustar georgesk georgesk /*
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.5/spec/RAFPlugin.js 0000664 0001750 0001750 00000003605 15062036313 016215 0 ustar georgesk georgesk /* 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.5/spec/SpecRunner.html 0000664 0001750 0001750 00000001571 15062036313 017042 0 ustar georgesk georgesk
SVG.js - Jasmine Spec Runner
svg.js-3.2.5/spec/checkForAllTests.js 0000664 0001750 0001750 00000001137 15062036313 017624 0 ustar georgesk georgesk const 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.5/spec/helpers.js 0000664 0001750 0001750 00000010165 15062036313 016067 0 ustar georgesk georgesk import { 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.5/spec/spec/ 0000775 0001750 0001750 00000000000 15062036313 015016 5 ustar georgesk georgesk svg.js-3.2.5/spec/spec/modules/ 0000775 0001750 0001750 00000000000 15062036313 016466 5 ustar georgesk georgesk svg.js-3.2.5/spec/spec/modules/core/ 0000775 0001750 0001750 00000000000 15062036313 017416 5 ustar georgesk georgesk svg.js-3.2.5/spec/spec/modules/core/parser.js 0000664 0001750 0001750 00000001534 15062036313 021253 0 ustar georgesk georgesk /* 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.5/spec/spec/modules/core/poly.js 0000664 0001750 0001750 00000006512 15062036313 020743 0 ustar georgesk georgesk /* 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.5/spec/spec/modules/core/pointed.js 0000664 0001750 0001750 00000003467 15062036313 021430 0 ustar georgesk georgesk /* 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.5/spec/spec/modules/core/event.js 0000664 0001750 0001750 00000017171 15062036313 021104 0 ustar georgesk georgesk /* 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.5/spec/spec/modules/core/containerGeometry.js 0000664 0001750 0001750 00000023624 15062036313 023461 0 ustar georgesk georgesk /* 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.5/spec/spec/modules/core/textable.js 0000664 0001750 0001750 00000026447 15062036313 021601 0 ustar georgesk georgesk /* 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.5/spec/spec/modules/core/regex.js 0000664 0001750 0001750 00000016341 15062036313 021073 0 ustar georgesk georgesk /* 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.5/spec/spec/modules/core/selector.js 0000664 0001750 0001750 00000004076 15062036313 021603 0 ustar georgesk georgesk /* 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.5/spec/spec/modules/core/gradiented.js 0000664 0001750 0001750 00000002332 15062036313 022062 0 ustar georgesk georgesk /* 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.5/spec/spec/modules/core/circled.js 0000664 0001750 0001750 00000005261 15062036313 021365 0 ustar georgesk georgesk /* 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.5/spec/spec/modules/core/attr.js 0000664 0001750 0001750 00000010314 15062036313 020725 0 ustar georgesk georgesk /* 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.5/spec/spec/modules/optional/ 0000775 0001750 0001750 00000000000 15062036313 020313 5 ustar georgesk georgesk svg.js-3.2.5/spec/spec/modules/optional/arrange.js 0000664 0001750 0001750 00000013771 15062036313 022301 0 ustar georgesk georgesk /* 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.5/spec/spec/modules/optional/data.js 0000664 0001750 0001750 00000007626 15062036313 021575 0 ustar georgesk georgesk /* 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.5/spec/spec/modules/optional/sugar.js 0000664 0001750 0001750 00000034205 15062036313 021776 0 ustar georgesk georgesk /* 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.5/spec/spec/modules/optional/class.js 0000664 0001750 0001750 00000005703 15062036313 021763 0 ustar georgesk georgesk /* 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.5/spec/spec/modules/optional/memory.js 0000664 0001750 0001750 00000006164 15062036313 022170 0 ustar georgesk georgesk /* 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.5/spec/spec/modules/optional/transform.js 0000664 0001750 0001750 00000013220 15062036313 022662 0 ustar georgesk georgesk /* 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.5/spec/spec/modules/optional/css.js 0000664 0001750 0001750 00000011352 15062036313 021443 0 ustar georgesk georgesk /* 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.5/spec/spec/animation/ 0000775 0001750 0001750 00000000000 15062036313 016775 5 ustar georgesk georgesk svg.js-3.2.5/spec/spec/animation/Queue.js 0000664 0001750 0001750 00000004760 15062036313 020426 0 ustar georgesk georgesk /* 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.5/spec/spec/animation/Controller.js 0000664 0001750 0001750 00000027604 15062036313 021467 0 ustar georgesk georgesk /* 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.5/spec/spec/animation/Timeline.js 0000664 0001750 0001750 00000040720 15062036313 021104 0 ustar georgesk georgesk /* 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.5/spec/spec/animation/Morphable.js 0000664 0001750 0001750 00000037256 15062036313 021261 0 ustar georgesk georgesk /* 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.5/spec/spec/animation/Runner.js 0000664 0001750 0001750 00000210626 15062036313 020613 0 ustar georgesk georgesk /* 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.5/spec/spec/animation/Animator.js 0000664 0001750 0001750 00000005057 15062036313 021114 0 ustar georgesk georgesk /* 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.5/spec/spec/types/ 0000775 0001750 0001750 00000000000 15062036313 016162 5 ustar georgesk georgesk svg.js-3.2.5/spec/spec/types/List.js 0000664 0001750 0001750 00000006703 15062036313 017441 0 ustar georgesk georgesk /* 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.5/spec/spec/types/Box.js 0000664 0001750 0001750 00000030437 15062036313 017257 0 ustar georgesk georgesk /* 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.5/spec/spec/types/Color.js 0000664 0001750 0001750 00000033543 15062036313 017606 0 ustar georgesk georgesk /* 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.5/spec/spec/types/SVGArray.js 0000664 0001750 0001750 00000004766 15062036313 020173 0 ustar georgesk georgesk /* 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.5/spec/spec/types/Point.js 0000664 0001750 0001750 00000005172 15062036313 017616 0 ustar georgesk georgesk /* 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.5/spec/spec/types/Matrix.js 0000664 0001750 0001750 00000044740 15062036313 017775 0 ustar georgesk georgesk /* 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.5/spec/spec/types/SVGNumber.js 0000664 0001750 0001750 00000014520 15062036313 020332 0 ustar georgesk georgesk /* 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.5/spec/spec/types/PathArray.js 0000664 0001750 0001750 00000005736 15062036313 020426 0 ustar georgesk georgesk /* 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.5/spec/spec/types/Base.js 0000664 0001750 0001750 00000000365 15062036313 017376 0 ustar georgesk georgesk /* 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.5/spec/spec/types/EventTarget.js 0000664 0001750 0001750 00000010231 15062036313 020745 0 ustar georgesk georgesk /* 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.5/spec/spec/types/PointArray.js 0000664 0001750 0001750 00000013574 15062036313 020622 0 ustar georgesk georgesk /* 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.5/spec/spec/elements/ 0000775 0001750 0001750 00000000000 15062036313 016632 5 ustar georgesk georgesk svg.js-3.2.5/spec/spec/elements/Defs.js 0000664 0001750 0001750 00000001366 15062036313 020057 0 ustar georgesk georgesk /* 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.5/spec/spec/elements/Use.js 0000664 0001750 0001750 00000002205 15062036313 017723 0 ustar georgesk georgesk /* 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.5/spec/spec/elements/Container.js 0000664 0001750 0001750 00000006776 15062036313 021132 0 ustar georgesk georgesk /* 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.5/spec/spec/elements/Style.js 0000664 0001750 0001750 00000005334 15062036313 020275 0 ustar georgesk georgesk /* 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.5/spec/spec/elements/Fragment.js 0000664 0001750 0001750 00000003773 15062036313 020745 0 ustar georgesk georgesk /* 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.5/spec/spec/elements/Stop.js 0000664 0001750 0001750 00000005052 15062036313 020117 0 ustar georgesk georgesk /* 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.5/spec/spec/elements/Polygon.js 0000664 0001750 0001750 00000001757 15062036313 020631 0 ustar georgesk georgesk /* 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.5/spec/spec/elements/ForeignObject.js 0000664 0001750 0001750 00000003072 15062036313 021712 0 ustar georgesk georgesk /* 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.5/spec/spec/elements/Image.js 0000664 0001750 0001750 00000007555 15062036313 020226 0 ustar georgesk georgesk /* 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.5/spec/spec/elements/G.js 0000664 0001750 0001750 00000001260 15062036313 017355 0 ustar georgesk georgesk /* 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.5/spec/spec/elements/Svg.js 0000664 0001750 0001750 00000010207 15062036313 017727 0 ustar georgesk georgesk /* 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.5/spec/spec/elements/TextPath.js 0000664 0001750 0001750 00000011314 15062036313 020731 0 ustar georgesk georgesk /* 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.5/spec/spec/elements/Mask.js 0000664 0001750 0001750 00000005565 15062036313 020076 0 ustar georgesk georgesk /* 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.5/spec/spec/elements/Path.js 0000664 0001750 0001750 00000012616 15062036313 020072 0 ustar georgesk georgesk /* 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.5/spec/spec/elements/Text.js 0000664 0001750 0001750 00000013350 15062036313 020116 0 ustar georgesk georgesk /* 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.5/spec/spec/elements/Gradient.js 0000664 0001750 0001750 00000006444 15062036313 020735 0 ustar georgesk georgesk /* 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.5/spec/spec/elements/Symbol.js 0000664 0001750 0001750 00000001301 15062036313 020430 0 ustar georgesk georgesk /* 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.5/spec/spec/elements/Dom.js 0000664 0001750 0001750 00000054174 15062036313 017722 0 ustar georgesk georgesk /* 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